1

APIを使用してmasm32でx86アセンブリにウィンドウを作成しようとしていCreateWindowExます。コードにコンパイル時のエラーなどがないようになりました。正常にコンパイルされます。しかし、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 

どこが間違っているのですか?12個のパラメーターが必要であることを考えると、それは何か関係があるのではないかと思いCreateWindowExますが、そのほとんどは私にはわかりません。

前もって感謝します。

4

2 に答える 2

1

CreateWindowExによって返されるウィンドウハンドルをhwnd変数に割り当てていないと思います。

したがって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

また、procの最後にretがありません

于 2012-08-30T23:03:21.487 に答える