2012-08-31 1 views
0

Мне удалось создать окно (спасибо всем здесь, в SO!), Но всякий раз, когда он запускается, окно формируется, но оно сразу же ломается, и появляется окно с надписью «test.exe перестала отвечать »(test.exe является именем программы).x86 assembly masm32 window application перестает отвечать

Вот код:

.386 
.model flat,stdcall 
option casemap:none 
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD 

include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\gdi32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\gdi32.lib 

.data 
ClassName db "SimpleWinClass",0 
AppName db "If you get this, it worked.",0 
char WPARAM 20h      

.data? 
hInstance HINSTANCE ? 
CommandLine LPSTR ? 

.code 
start: 
push NULL 
call GetModuleHandle 
mov hInstance,eax 
call GetCommandLine 
mov CommandLine,eax 
push SW_SHOWDEFAULT 
push CommandLine 
push NULL 
push hInstance 
call WinMain 
push eax 
call ExitProcess 

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
LOCAL wc:WNDCLASSEX 
LOCAL msg:MSG 
LOCAL hwnd:HWND 
mov wc.cbSize,SIZEOF WNDCLASSEX 
mov wc.style, CS_HREDRAW or CS_VREDRAW 
mov wc.lpfnWndProc, OFFSET WndProc 
mov wc.cbClsExtra,NULL 
mov wc.cbWndExtra,NULL 
push hInst 
pop wc.hInstance 
mov wc.hbrBackground,COLOR_WINDOW+1 
mov wc.lpszMenuName,NULL 
mov wc.lpszClassName,OFFSET ClassName 
push IDI_APPLICATION 
push NULL 
call LoadIcon 
mov wc.hIcon,eax 
mov wc.hIconSm,eax 
push IDC_ARROW 
push NULL 
call LoadCursor 
mov wc.hCursor,eax 
lea eax, wc 
push eax 
call RegisterClassEx 
push NULL 
push hInst 
push NULL 
push NULL 
push CW_USEDEFAULT 
push CW_USEDEFAULT 
push CW_USEDEFAULT 
push CW_USEDEFAULT 
push WS_OVERLAPPEDWINDOW 
lea eax, AppName 
push eax 
lea eax, ClassName 
push eax 
push NULL 
call CreateWindowEx 
    mov hwnd,eax 
push SW_SHOWNORMAL 
push hwnd 
call ShowWindow 
    push hwnd 
    call UpdateWindow 
    .WHILE TRUE 
     push 0 
     push 0 
     push NULL 
     lea eax, msg 
     push eax 
     call GetMessage 
     .BREAK .IF (!eax) 
     lea eax, msg 
     push eax 
     call TranslateMessage 
     lea eax, msg 
     call DispatchMessage 
    .ENDW 
    mov  eax,msg.wParam 
    ret 
WinMain endp 

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    LOCAL hdc:HDC 
    LOCAL ps:PAINTSTRUCT 

    .IF uMsg==WM_DESTROY 
    push NULL 
    call PostQuitMessage 
    .ELSEIF uMsg==WM_CHAR 
     push wParam 
     pop char 
    push TRUE 
    push NULL 
    push hWnd 
    call InvalidateRect 
    .ELSEIF uMsg==WM_PAINT 
    lea eax, ps 
    push eax 
    push hWnd 
    call BeginPaint 
     mov hdc,eax 
    push 1 
    lea eax, char 
    push eax 
    push 0 
    push 0 
    push hdc 
    call TextOut 
    lea eax, ps 
    push eax 
    push hWnd 
    call EndPaint 
    .ELSE 
    push lParam 
    push wParam 
    push uMsg 
    push hWnd 
    call DefWindowProc 
     ret 
    .ENDIF 
     xor eax,eax 
     ret 
    push 0 
    call ExitProcess 
WndProc endp 
end start 

Почему это держать ломка? Я видел то же самое, когда я не помещал call ExitProcess, но у меня на этот раз, так почему он будет закрываться?

Заранее спасибо

ответ

2

Поскольку ваш новичок и с помощью MASM, я настоятельно рекомендую вам НЕ используя нажимные/звонки !!!! Вы не получаете НИЧЕГО, не используя INVOKE, кроме ошибок.

Если вы использовали invoke, ml поймал бы проблему.

Вы не нашли что-то здесь?

lea eax, msg 
call DispatchMessage 

Ваш забугошник push eax!

Кроме того, для вас и для всех, кто должен прочитать ваш код, используйте стиль отступов. Обычно между левым полем и mnuemonics существует 4 пробела.

+0

Извините за отступ и форматирование. Я буду отмечать это в будущем. – Progrmr