谁真正知道为什么子窗口(按钮)没有创建或者在wm_create消息后可能看不到

时间:2014-02-22 18:32:46

标签: windows

extern GetModuleHandleA
extern LoadCursorA
extern RegisterClassA
extern CreateWindowExA
extern GetMessageA
extern DispatchMessageA
extern TranslateMessage
extern ExitProcess
extern PostQuitMessage
extern DefWindowProcA

section .data

MSG      dq 0         ;+0 hWnd
dd 0         ;+8 message
dd 0         ;padding for next
wParam dq 0         ;+10 wParam
dq 0         ;+18 lParam
dd 0         ;+20 time
dd 0         ;+24 1st part of point structure
dd 0         ;+28 2nd part of point structure
dd 0         ;padding to bring total size to 48 bytes

WNDCLASS dd 1h+2h+40h ;+0 window class style (CS_VREDRAW+CS_HREDRAW+CS_CLASSDC)
dd 0         ;padding for next
dq WndProcTable       ;+8 pointer to Window Procedure
dd 0         ;+10 no. of extra bytes to allocate after structure
dd 0         ;+14 no. of extra bytes to allocate after window instance
hInst dq 0         ;+18 handle to instance containing window procedure
dq 0         ;+20 handle to the class icon
hCursor dq 0         ;+28 handle to the class cursor
dq 6         ;+30 identifies the class background brush (6=COLOR_WINDOW+1)
dq 0         ;+38 pointer to resource name for class menu
dq win_class_name   ;+40 pointer to string for window class name

win_class_name db 'simplewindow',0     ;string holding name of window class
win_id dq 0  
but_id dq 0
kopf db '64 bit program', 0
class_button db 'button', 0
button_kopf db 'hjh', 0

mbt db 'this is only a test', 0
mbc db 'achtung', 0

section .text

global  start
start:  
sub rsp, 0x8
xor rcx, rcx
call  GetModuleHandleA
mov [hInst], rax
mov rcx, 0
mov rdx, 32512
call LoadCursorA
mov [hCursor], rax  
mov rcx,  WNDCLASS
sub rsp, 0x20
call RegisterClassA
add rsp, 0x20

;creating main window
mov rcx, 0
mov rdx, win_class_name
mov r8, kopf
mov r9, 0x10000000+0x00080000+0x00020000
push 0
push qword[hInst]
push 0
push 0
push 512
push 512
push 256
push 256
sub rsp, 0x20
call CreateWindowExA
add rsp, 0x20
add rsp, 0x40
mov [win_id], rax  

zyklus:
mov rcx, MSG
mov rdx, 0
mov r8, 0
mov r9, 0
sub rsp, 20h  
call GetMessageA
add rsp, 20h
or rax, rax
jz fertig
mov rcx, MSG 
call TranslateMessage  
mov rcx, MSG   
call DispatchMessageA  
jmp zyklus

fertig:
mov rcx,  [wParam]
call ExitProcess

WndProcTable:  
sub rsp, 0x8
cmp edx, 0x01  ; see if it is wm_create  message
jne quit              

; creating button

mov rcx, 0
mov rdx, class_button
mov r8, button_kopf
mov r9, 0x40000000+0x10000000  ; child +visible
push 0
push qword[hInst]
push 0
push qword[win_id]
push 20
push 50
push 30
push 30
sub rsp, 0x20
call CreateWindowExA
add rsp, 0x20
add rsp, 0x40
mov [but_id], rax        
jmp alles

quit:
cmp edx, 0x02
jne weiter

xor rcx, rcx
call PostQuitMessage
weiter:
sub rsp,20h            
call DefWindowProcA
add rsp,20h             

alles:
add rsp, 0x8

ret

但是如果在创建主窗口代码后放置创建按钮代码 一切正常,但在处理wm_create mrssage时失败了

nasm -f win64 first.nasm -o first,obj  首先是golink,obj user32.dll kernel32.dll gdi32.dll

按钮不会出现或根本不会创建 怎么了? 我想知道这段代码出了什么问题 是否有人注意到此代码中的任何错误 我不知道在哪里可以找到错误

现在它已经解决了。 wm_create有效句柄在rcx寄存器中后,主窗口句柄在创建按钮时无效(它在wndproctable中作为第一个参数传递)所以右边是push rcx

1 个答案:

答案 0 :(得分:0)

现在它已经解决了。 wm_create有效句柄在rcx寄存器中后,主窗口句柄在创建按钮时无效(它在wndproctable中作为第一个参数传递)所以右边是push rcx