2012-08-31 111 views
0

我已经设法创建一个窗口(感谢所有人在这里!),但每当它运行,窗口形式,但它立即中断,并弹出一个窗口说“test.exe已停止响应“(test.exe是该程序的名称)。x86汇编masm32窗口应用程序停止响应

下面是代码:

.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您的初学者,我强烈建议你不使用推/电话!!!!除了bug之外,您不使用INVOKE也没有任何用处。

如果您使用了invoke,ml会发现问题。

你错过了什么吗?

lea eax, msg 
call DispatchMessage 

忘记push eax

另外,为了您和其他需要阅读代码的人,请使用缩进样式。通常在左边距和多边形区域之间有4个空格。

+0

对于缩进和格式化很抱歉。我将来会注意到这一点。 – Progrmr