首页
社区
课程
招聘
[旧帖] [求助]Win32ASM窗口程序 0.00雪花
发表于: 2008-10-17 18:29 2599

[旧帖] [求助]Win32ASM窗口程序 0.00雪花

2008-10-17 18:29
2599
照着《Windows环境下32位汇编语言设计程序》上的例子,写了个HelloWorld的程序。就是让它弹出来一个窗口,中间写着“HelloWorld”,但生成的exe文件运行后会一下出来38个叠在一起的窗口。不知道是哪里写错了,望指点,谢谢!

代码如下:

		.386
		.model flat, stdcall
		option casemap:none
;------------------include----------------------------------
include		windows.inc
include		gdi32.inc
includelib	gdi32.lib
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
;-------------------data---------------------------------
		.data?
hInstance	dd	?
hWinMain	dd	?

		.const
szClassName	db	'MyClass', 0
szCaptionMain	db	'Hello World in Win32 ASM', 0
szText		db	'Hello World!', 0
;-------------------code------------------------------
		.code
	;----------Window callback function--------
_ProcWinMain	proc	uses ebx edi esi, hwnd, uMsg, wParam, lParam
		local	@stPs: PAINTSTRUCT
		local	@stRect: RECT
		local	@hdc
		
		mov eax, uMsg
		;-------------------
		.if	eax == WM_PAINT
			invoke	BeginPaint, hwnd, addr @stPs
			mov	@hdc, eax
			
			invoke	GetClientRect, hwnd, addr @stRect
			invoke	DrawText, @hdc, addr szText, -1,\
				addr @stRect,\
				DT_SINGLELINE or DT_CENTER or DT_VCENTER
				
			invoke	EndPaint, hwnd, addr @stPs
		;-------------------
		.elseif	eax == WM_CLOSE
			invoke	DestroyWindow, hWinMain
			invoke	PostQuitMessage, NULL
		;---------------------
		.else
			invoke	DefWindowProc, hwnd, uMsg, wParam, lParam
			ret
		.endif
		;---------------------
_ProcWinMain	endp
;--------------------------_WinMain--------------------
_WinMain	proc
		local	@stWndClass: WNDCLASSEX
		local	@stMsg: MSG
		
		invoke	GetModuleHandle, NULL
		mov	hInstance, eax
		invoke	RtlZeroMemory, addr @stWndClass, sizeof @stWndClass
		;--------------Register Window Class-----------
		invoke	LoadCursor, 0, IDC_ARROW
		mov	@stWndClass.hCursor, eax
		push	hInstance
		pop	@stWndClass.hInstance
		mov	@stWndClass.cbSize, sizeof WNDCLASSEX
		mov	@stWndClass.style, CS_HREDRAW or CS_VREDRAW
		mov	@stWndClass.lpfnWndProc, offset _ProcWinMain
		mov	@stWndClass.hbrBackground, COLOR_WINDOW+1
		mov	@stWndClass.lpszClassName, offset szClassName
		invoke	RegisterClassEx, addr @stWndClass
		;--------------Create Window-------------------
		invoke	CreateWindowEx, WS_EX_CLIENTEDGE,\
			offset szClassName, offset szCaptionMain, \
			WS_OVERLAPPEDWINDOW,\
			100, 100, 600, 400,\
			NULL, NULL, hInstance, NULL
		mov	hWinMain, eax
		invoke	ShowWindow, hWinMain, SW_SHOWNORMAL
		invoke	UpdateWindow, hWinMain
		;-----------------Message loop-------------------
		.while TRUE
			invoke	GetMessage, addr @stMsg, NULL, 0, 0
			.break	.if	eax == 0
			invoke	TranslateMessage, addr @stMsg
			invoke	DispatchMessage, addr @stMsg
		.endw
		ret
_WinMain	endp
;-------------------------------------
start:
		call _WinMain
		invoke	ExitProcess, NULL
;------------------------------------
		end start

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是应为
_ProcWinMain  proc
    ...
    ...
    ...
_ProcWinMain  endp
最后没有写 ret,貌似不是每个分支都有ret。
2008-10-17 19:27
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
的确是在_ProcWinMain中没有ret,谢谢!
2008-10-17 20:22
0
游客
登录 | 注册 方可回帖
返回
//