x86 сборка masm32 оконное приложение перестает отвечать на запросы

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

Вот код:

.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, но на этот раз у меня есть, так почему он продолжает отключаться?

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


person Progrmr    schedule 31.08.2012    source источник


Ответы (1)


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

Если бы вы использовали Invoke, мл обнаружил бы проблему.

Вы что-то пропустили здесь?

lea eax, msg
call DispatchMessage

Вы забыли push eax!

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

person Gunner    schedule 02.09.2012
comment
Извините за отступы и форматирование. Я приму это к сведению в будущем. - person Progrmr; 06.09.2012