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

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

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

.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直播授课

收藏
免费 0
支持
分享
最新回复 (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
    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]
    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
活跃值: (3072)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
7
应该定义一个全局变量hWinMain.
2011-1-25 08:34
0
游客
登录 | 注册 方可回帖
返回
//