我正尝试使用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
使用Assebmly时我们不会编译任何东西! 我们汇集和链接。
这不是C或任何其他高级语言,你不需要WinMain。
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结尾失踪