我已经设法创建了一个窗口(感谢大家在这里!),但无论何时运行,窗口都会形成,但它会立即中断并弹出一个窗口,说“test.exe已停止响应”(测试。 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
但是我有这个时间,为什么它会继续关闭?
提前致谢
答案 0 :(得分:2)
由于您是初学者并使用MASM,我强烈建议您不要使用推/叫!!!!除了错误之外,你没有使用INVOKE。
如果你使用了invoke,那么ml会解决这个问题。
你在这里遗失了什么吗?
lea eax, msg
call DispatchMessage
忘了push eax
!
此外,为了您和其他必须阅读您的代码的人,请使用缩进样式。通常左边距和mnuemonics之间有4个空格。