繁体   English   中英

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

[英]x86 assembly - window does not show up yet no compile-time errors

我正在尝试使用CreateWindowEx API在CreateWindowEx x86程序集中创建一个窗口。 我得到的代码没有编译时错误或任何类型的错误-它可以正常编译。 但是,当我运行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 CreateWindowExinvoke ShowWindow之前添加以下行-

mov hwnd, eax
  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM