【问题标题】:x86 assembly - window does not show up yet no compile-time errorsx86 程序集 - 窗口未显示但没有编译时错误
【发布时间】:2012-08-30 05:14:08
【问题描述】:

我正在尝试使用 CreateWindowEx API 在 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 个参数,其中大部分我不明白。

提前致谢。

【问题讨论】:

    标签: windows assembly x86 masm32


    【解决方案1】:

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

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

    mov hwnd, eax
    

    【讨论】:

    • 当我把那行放在那里时,它仍然没有显示任何窗口。
    • 最好对 API 的返回值进行一些错误检查。因此,在每次调用后,检查eax 的值是否存在错误情况。您可以做的另一件事是处理WndProc 中的WM_CREATE 消息并将eax 设置为0 - xor eax, eax
    【解决方案2】:
    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 在你的过程结束时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多