首页
社区
课程
招聘
遭不住了,CreateWindowEx创建不了窗口
发表于: 2011-1-24 19:26 5099

遭不住了,CreateWindowEx创建不了窗口

2011-1-24 19:26
5099
以下是我用罗云彬汇编例程和另外一个例程综合出来的,但是CreateWindowEx始终返回0,几天了,崩溃。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
.386
.model flat,stdcall
option casemap:none
 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;include定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
 
 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szTitle db '窗口标题',0
szMsg   db '窗口消息',0
szError db '窗口创建失败',0
szClassName db "wndclass",0
 
        .data?
hInstance dd ?
 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
_WindowProc proc _hwnd:DWORD,_uMsg:DWORD,_wParam:DWORD,_lParam:DWORD
    LOCAL   @stPaint:PAINTSTRUCT
    LOCAL   @hdc
    LOCAL   @stRect:RECT
     
    mov eax,_uMsg
    .if eax == WM_PAINT
        invoke  BeginPaint,_hwnd,addr @stPaint
        mov @hdc,eax
        invoke GetClientRect,_hwnd,addr @stRect
        invoke DrawText,@hdc,offset szMsg,lengthof szMsg,addr @stRect,DT_CENTER
        invoke EndPaint,_hwnd,addr @stPaint
         
        invoke MessageBox,NULL,offset szTitle,offset szTitle,MB_OK
    .elseif eax == WM_CLOSE
        invoke DestroyWindow,_hwnd
        invoke PostQuitMessage,NULL
    .else
         
        invoke DefWindowProc,_hwnd,_uMsg,_wParam,_lParam
    .endif
     
    xor eax,eax
    ret
 
_WindowProc endp
 
 
_WinMain    proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
    LOCAL   @wndclass:WNDCLASSEX
    LOCAL   @msg:MSG
    LOCAL   @hwnd:HWND
    ;初始化窗口类
    mov @wndclass.cbSize,sizeof WNDCLASSEX
    mov @wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
    mov @wndclass.lpfnWndProc,offset _WindowProc
    mov @wndclass.cbClsExtra,NULL
    mov @wndclass.cbWndExtra,NULL
    push hInst
    pop @wndclass.hInstance
    mov @wndclass.hbrBackground,COLOR_BTNFACE+1
    mov @wndclass.lpszMenuName,NULL
    mov @wndclass.lpszClassName,offset szClassName
    invoke LoadIcon,hInst,100
    mov @wndclass.hIcon,eax
    invoke LoadCursor ,0,IDC_ARROW
    mov @wndclass.hCursor,eax
    mov @wndclass.hIconSm,0
     
    ;注册窗口类
    invoke RegisterClassEx,addr @wndclass
     
    ;创建并显示窗口
    invoke CreateWindowEx,NULL,addr szClassName,addr szTitle,WS_OVERLAPPEDWINDOW,200,200,600,300,NULL,NULL,hInst,NULL
    .if !eax    ;如果句柄为0则表示窗口创建失败
        invoke MessageBox,NULL,offset szError,offset szTitle,MB_OK
        ret
    .endif
    mov @hwnd,eax
    invoke ShowWindow,@hwnd,SW_SHOWNORMAL
     
    ;更新窗口消息循环
    invoke UpdateWindow,@hwnd
    .while TRUE
        invoke GetMessage,addr @msg,NULL,0,0
        .break .if eax == 0
        invoke TranslateMessage,addr @msg
        invoke DispatchMessage,addr @msg
    .endw
    mov eax,@msg.wParam
    ret
 
_WinMain endp
main:  
        invoke GetModuleHandle,NULL
        mov hInstance,eax
         
        invoke  _WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
        invoke ExitProcess,0
end main


本人太菜,高手莫笑,解答便是。

谢谢了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (6)
雪    币: 41
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
invoke CreateWindowEx,NULL,addr szClassName,addr szTitle,WS_OVERLAPPEDWINDOW,200,200,600,300,NULL,NULL,hInst,NULL

lz 创建的时候 应该是传  你注册的窗口类。。。  但是 你这里 貌似是 又重新定义了一个变量。。。  还有 窗口标题 也应该是自己定义窗口标题名的。。。 你这里貌似没修改 直接重新创建了一个变量。。。

我虽然对反汇编不怎么了解。。。  不过  写c++时间久了。。。  也能看出个大概。。。

应该就是 你的  前 3个参数有问题。。。 lz 好好看看。。。  加油把

  如果我说得对。。。 lz 希望给分啊。。。=.= 好像能个邀请码。 努力下。。。
2011-1-24 20:16
0
雪    币: 3098
活跃值: (229)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1
2
invoke DefWindowProc,_hwnd,_uMsg,_wParam,_lParam
      ret


失败的原因是WM_CREATE消息米处理, DefWindowProc 后 + ret
2011-1-24 21:06
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
应该是注册窗口类吧:RegisterClassEx,这里给窗口类

CteateWindowEx传hInstance就行了。。
2011-1-24 21:25
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=独自修行;918958]
1
2
invoke DefWindowProc,_hwnd,_uMsg,_wParam,_lParam
      ret


失败的原因是WM_CREATE消息米处理, DefWindowProc 后 + ret[/QUOTE]

WM_CREATE消息是交给:DefWindowProc 处理的,不用自己手动处理WM_CREATE消息吧
2011-1-24 21:26
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢『独自修行』修行大虾,果然是没加ret的原因。。。

不过我看你已经那么多钱了,就把分给『qwopzm』了,希望不要见怪。
2011-1-24 21:29
0
雪    币: 1432
活跃值: (3512)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
7
应该定义一个全局变量hWinMain.
2011-1-25 08:34
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册