2012-08-30 58 views
1

我想在使用CreateWindowEx API的masm32的x86程序集中創建一個窗口。我已經得到我的代碼沒有編譯時錯誤或類似的東西 - 它編譯得很好。但是當我運行這個exe時,沒有任何反應。我沒有看到任何明顯的錯誤,並且實際上已將代碼從Iczelion的Win32教程(第3部分 - 簡單窗口)中複製出來。它有什麼問題?x86程序集 - 窗口沒有顯示,但沒有編譯時錯誤

這裏是我的代碼:

.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個參數,其中大部分我都不明白。

在此先感謝。

回答

1

我相信你還沒有將由CreateWindowEx返回的窗口句柄賦值給hwnd變量。

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

mov hwnd, eax 
+0

當我把那條線放在那裏時,它仍然沒有顯示任何窗口。 – Progrmr

+0

對API的返回值進行一些錯誤檢查會很好。因此,在每次調用之後,檢查錯誤情況下'eax'的值。你可以做的另一件事是在'WndProc'中處理'WM_CREATE'消息,並將'eax'設置爲0 - 'xor eax,eax'。 – Superman

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你的過程結束

相關問題