主题:程序退出问题
初学者,按照教材写了一个windows窗口出来,但是点击关闭按钮后只是窗口关闭而,进程无法关闭,请高手帮帮忙看看怎么回事,代码如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
WinMain proto :dword,:dword,:dword,:dword
.data
ClassName byte 'SimpleWinClass',0
AppName byte 'our first window',0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPreInst:HINSTANCE,CmdLine:LPSTR,CmdShow:dword
LOCAL wc:WNDCLASSEX,msg:MSG,hwnd:HWND
;initialization of wndclassex
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WinProc
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
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
;register the windows class
invoke RegisterClassEx,addr wc
;create window
invoke CreateWindowEx,NULL,addr ClassName,addr AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
mov hwnd,eax
;show window
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
;enter message loop
.while TRUE
invoke GetMessage,addr msg,hwnd,0,0
.break.if(!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
mov eax,msg.wParam
.endw
ret
WinMain endp
WinProc proc hwnd:HWND,uMSG:UINT,wParam:WPARAM,lParam:LPARAM
.if uMSG==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hwnd,uMSG,wParam,lParam
ret
.endif
xor eax,eax
ret
WinProc endp
end start
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
WinMain proto :dword,:dword,:dword,:dword
.data
ClassName byte 'SimpleWinClass',0
AppName byte 'our first window',0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPreInst:HINSTANCE,CmdLine:LPSTR,CmdShow:dword
LOCAL wc:WNDCLASSEX,msg:MSG,hwnd:HWND
;initialization of wndclassex
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WinProc
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
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
;register the windows class
invoke RegisterClassEx,addr wc
;create window
invoke CreateWindowEx,NULL,addr ClassName,addr AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
mov hwnd,eax
;show window
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
;enter message loop
.while TRUE
invoke GetMessage,addr msg,hwnd,0,0
.break.if(!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
mov eax,msg.wParam
.endw
ret
WinMain endp
WinProc proc hwnd:HWND,uMSG:UINT,wParam:WPARAM,lParam:LPARAM
.if uMSG==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hwnd,uMSG,wParam,lParam
ret
.endif
xor eax,eax
ret
WinProc endp
end start