1

我正在尝试使用CreateWindowExAPI 在 x86 程序集中创建一个带有 masm32 的窗口。我已经让我的代码没有编译时错误或任何类似的错误——它编译得很好。然而,当我运行 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 个参数,其中大部分我不明白。

提前致谢。

4

2 回答 2

1

我相信您还没有将返回的窗口句柄分配CreateWindowExhwnd变量。

invoke CreateWindowEx所以在之前和之后添加以下行invoke ShowWindow-

mov hwnd, eax
于 2012-08-30T05:27:15.470 回答
0
  1. 使用 Assebmly 时我们不编译任何东西!我们组装和链接。

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

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

在你的 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

您还缺少ret在您的过程结束时

于 2012-08-30T23:03:21.487 回答