собсно вот код простенькой программы: Код (Text): .386 .model flat,stdcall option casemap:none DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data DlgName db 'IDD_DLG1',0 MessText db 'Тыщ!',0 MessCap db 'Хеловорд :)',0 MessText2 db 'Выходим нах!',0 .data? HINST dd ? .const IDD_DLG1 equ 1000 IDC_BTN1 equ 1001 DC_BTN2 equ 1002 IDC_EXIT equ 3002 .code start: INVOKE GetModuleHandle,NULL mov HINST,eax INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL INVOKE ExitProcess,eax DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg==WM_CLOSE INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0 .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF ax==IDC_BTN1 INVOKE MessageBox,0,ADDR MessText,ADDR MessCap,MB_OK .ENDIF .ELSEIF uMsg==IDC_EXIT INVOKE EndDialog,hWnd,NULL .ELSEIF uMsg==DC_BTN2 INVOKE MessageBox,0,ADDR MessText2,ADDR MessCap,MB_OK INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0 .ENDIF mov eax,FALSE Ret DlgProc EndP end start а вот код РЦ-файла: Код (Text): #define IDD_DLG1 1000 #define IDC_BTN1 1001 #define IDC_BTN2 1002 IDD_DLG1 DIALOGEX 6,6,194,106 CAPTION "Привет Мир!" FONT 8,"MS Sans Serif",0,0 STYLE 0x00CB0804 BEGIN CONTROL "Тыщ!",IDC_BTN1,"Button",0x50010000,26,44,54,13 CONTROL "Нажми!",IDC_BTN2,"Button",0x50010000,120,44,54,13 END чтобы откомпились запускаю со следующими параметрами: Код (Text): C:\masm32\bin\rc DLG_EXE.rc C:\masm32\bin\ml /c /coff DLG_EXE.asm C:\masm32\bin\Link /SUBSYSTEM:WINDOWS DLG_EXE.obj DLG_EXE.res И создаётся эксе-программа. Но она не работает... =( Что я делаю не так?
нашёл вроде ошибки, теперь код выглядит так: Код (Text): .386 .model flat,stdcall option casemap:none DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data DlgName db 'IDD_DLG1',0 MessText db 'Тыщ!',0 MessCap db 'Хеловорд :)',0 MessText2 db 'Выходим нах!',0 .data? HINST dd ? .const IDD_DLG1 equ 1000 IDC_BTN1 equ 1001 DC_BTN2 equ 1002 IDC_EXIT equ 3002 .code start: INVOKE GetModuleHandle,NULL mov HINST,eax INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL INVOKE ExitProcess,eax DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg==WM_CLOSE INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0 .ELSEIF uMsg==BN_CLICKED mov eax,wParam .IF ax==IDC_BTN1 INVOKE MessageBox,0,ADDR MessText,ADDR MessCap,MB_OK .ELSEIF ax==DC_BTN2 INVOKE MessageBox,0,ADDR MessText2,ADDR MessCap,MB_OK INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0 .ENDIF .ELSEIF uMsg==IDC_EXIT INVOKE EndDialog,hWnd,NULL .ENDIF mov eax,FALSE Ret DlgProc EndP end start Но всеравно не работает(((
Что значит не работает? Крешится? Самоудаляется? Цвет окна не тот? И самый животрепещущий вопрос: что видно в отладчике? Какая-то из функций вернула ошибку?
Не работает - значит не выводится окно даже =) В отладке я не силён. Выполнял код пошагово в ольке, но это меня в тупик загнало. INVOKE GetModuleHandle,NULL mov HINST,eax INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL INVOKE ExitProcess,eax выолняет DialogBoxParam, а дальше идёт на ExitProcess сразу... Я с диалогами впервые работаю. Тут нет цикла сообщений и т.п. А когда выполняю пошагово, не попадаю на процедуру DlgProc Кому не трудно, посмотрите код. Думаю, гуру заметит ошибку невооружённым глазом. так как кода мало....
Зачем ждать столько времени, если можно сравнить с проверенным Зелионом ? http://wasm.ru/article.php?article=1001010
Блин, ребята, вы куда редактирование постов дели??? Придется вдогонку писать вместо добавления Итак, комментарий к моему предыдущему посту: Функция DialogBoxParam 2-м параметром принимает (внимание!) или указатель на имя диалога, или целое число, указывающее на номер диалога в ресурсах. Ты задал идентификатор диалога (т.е. целое число) в ресурсах. Но пытаешься использовать указатель на его имя (которое ты вообще не задал). Либо надо править ресурсы и давать диалогу ИМЯ вместо целочисленного идентификатора, либо передавать в функцию целочисленный идентификатор диалога, вместо указателя на строку.
splinter собсно вот код простенькой программы: Код (Text): .686P .model flat includelib user32.lib include windows.inc extern _imp__DialogBoxParamA@20:dword extern _imp__SendMessageA@16:dword extern _imp__MessageBoxA@16:dword extern _imp__EndDialog@8:dword .const IDC_BUTTON equ 0 IDC_EXIT equ 1 .code start: xchg ebx,eax push ebx ;0 push offset DlgProc push ebx push offset DlgName push 400000h ;hInstance call _imp__DialogBoxParamA@20 ret DlgName db "MyDialog",0 DlgProc proc hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD mov eax,Msg mov esi,hwnd sub eax,WM_CLOSE je short @@WM_CLOSE sub eax,WM_COMMAND-WM_CLOSE jne short a1 @@WM_COMMAND: movzx eax,word ptr wParam jmp dword ptr menu_handlers[eax*4] @@WM_CLOSE: push ebx push IDC_EXIT push WM_COMMAND push esi ;hwnd call _imp__SendMessageA@16 jmp short a1 MBox: push ebx ;MB_OK push offset MessCap push offset MessText push ebx call _imp__MessageBoxA@16 jmp short a1 EXIT: push ebx ;MB_OK push offset MessCap push offset MessText2 push ebx call _imp__MessageBoxA@16 push ebx push esi ;hwnd call _imp__EndDialog@8 a1: xor eax,eax ret 10h menu_handlers dd MBox, EXIT MessText db 'Тыщ!',0 MessCap db 'Хеловорд :)',0 MessText2 db 'Выходим нах!',0 DlgProc endp end start а вот код РЦ-файла: Код (Text): #include "resource.h" #define IDC_BUTTON 0 #define IDC_EXIT 1 MyDialog DIALOGEX 6, 6, 194, 106 STYLE 0xCB0804 FONT 8,"MS Sans Serif",0,0 CAPTION "Привет Мир!" BEGIN CONTROL "Тыщ!",IDC_BUTTON,"Button",0x50010000,26,44,54,13 CONTROL "Нажми!",IDC_EXIT,"Button",0x50010000,120,44,54,13 END чтобы откомпились запускаю со следующими параметрами: Код (Text): if exist %filename%.rc ( %masm_path%\bin\rc /v %1.rc %masm_path%\bin\cvtres /machine:ix86 %1.res %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm || exit %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.data=.text ^ /LIBPATH:%masm_path%\lib /NOLOGO %filename%.obj %filename%.res || exit del %filename%.res ) else ( %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm || exit %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.data=.text ^ /LIBPATH:%masm_path%\lib /NOLOGO %filename%.obj ) В чем разница -- ищи сам. В аттаче сорц и ехе
splinter start: xchg ebx,eax <-- это характерно для Windows XP там при старте приложения eax=0 для других Windows лучше поставте xor ebx,ebx [offtop] Что за хрень с редактированием?[/offtop]
FatMoon, спасибо, мен! Остальным тоже спасибо! Используя ресурседит не уследил за самим ресурсом, так как пологался на него... А про способ с Идентификатором я и не знал =)