x86程序集 – 窗口不显示,但没有编译时错误

我正尝试使用CreateWindowEx API在CreateWindowEx x86汇编中创build一个窗口。 我已经得到我的代码没有编译时错误或任何types的 – 它编译得很好。 但是,当我运行该exe文件,没有任何反应。 我没有看到任何明显的错误,我实际上已经从Iczelion的Win32教程(第3部分 – 一个简单的窗口)中复制了代码。 它有什么问题?

这是我的代码:

 .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 "Testwin", 0 AppName db "Testing Window", 0 .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 vars: LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND ; defining the window: 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 invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ;create the window invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL invoke ShowWindow,hwnd,SW_SHOWNORMAL WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM cmp uMsg, WM_DESTROY jne _next invoke PostQuitMessage, NULL _next: WndProc endp end start 

我哪里错了? 我怀疑它与CreateWindowEx ,考虑到它需要12个参数,其中大部分我不明白。

提前致谢。

我相信你还没有将由CreateWindowEx返回的窗口句柄分配给hwnd变量。

因此,在invoke CreateWindowEx并在invoke ShowWindow之前添加以下行 –

 mov hwnd, eax 
  1. 使用Assebmly时我们不会编译任何东西! 我们汇集和链接。

  2. 这不是C或任何其他高级语言,你不需要WinMain。

  3. biggie,你的消息循环在哪里

在你的CreateWindowEx和ShowWindow之后,你需要像这样的东西:

 .while TRUE invoke GetMessage,addr msg,NULL,0,0 .break .if !eax ;invoke IsDialogMessage,hModelessDialog,addr msg ;.if !eax ;invoke TranslateAccelerator,hWnd,hAccel,addr msg ;.if !eax invoke TranslateMessage,addr msg invoke DispatchMessage,addr msg ;.endif ;.endif .endw 

你也在你的proc结尾失踪