aa05001 发表于 2014-9-29 21:57:04

win32 课程中,源代码的不理解。请教

                .data?
hInstance        dd                ?
hWinMain        dd                ?

_WinMain        proc
                local        @stWndClass:WNDCLASSEX
                local        @stMsg:MSG

1                invoke        GetModuleHandle,NULL
2                mov         hInstance,eax
3                invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
4
5            invoke   LoadCursor,0,IDC_ARROW
6                mov        @stWndClass.hCursor,eax
7                push        hInstance
8                pop        @stWndClass.hInstance
9                mov        @stWndClass.cbSize,sizeof WNDCLASSEX
10                mov        @stWndClass.style,CS_HREDRAW or CS_VREDRAW
11                mov        @stWndClass.lpfnWndProc,offset _ProcWinMain
12                mov        @stWndClass.hbrBackground,COLOR_WINDOW + 1
13                mov        @stWndClass.lpszClassName,offset szClassName
14                invoke        RegisterClassEx,addr @stWndClass


第一个问题第二行中的mov         hInstance,eax,这里面的hInstance 是不是全局变量中的那个?
第二个问题第三行中的RtlZeroMemory,后面的两个参数。为什么指的是 lpCursorName和 hInstance难道不应该是所有的所有的成员吗? (lpCursorName和 hInstance)是通过IDA反汇编看出来的
第三个问题第七行中的PUSHhInstance 跟第八行pop        @stWndClass.hInstance 中的hInsthance 中的是同一个吗?是不是都是全局变量的那个?
请解答,谢谢,自学不容易,老师讲的又过于快

aa05001 发表于 2014-9-30 09:56:30

自己给自己顶一下,来个大牛帮助下啊

dAb 发表于 2014-10-1 06:04:06

第一个问题 =是的,将返回值保存到全局变量
第二个问题 =RtlZeroMemory其实就是将一段内存置0的函数,参数1为开始地址,2为长度。一般的结构在内存中也就是一段连续的内存,sizeof取了这个结构的长度(这个长度包含了你说的所有成员),addr取了这个结构的开始地址
第三个问题 = PUSHhInstance就是你第1个问题那个,@stWndClass.hInstance 中的hInsthance是这个结构@stWndClass的一个成员
pushhInstance                      ;压栈全局变量hInstance
pop   @stWndClass.hInstance   ; 出栈 (就是将上面那个全局变量赋值给这个结构的成员hInstance)

你可以这样理解
mov   eax,hInstance
mov   @stWndClass.hInstance,eax

我觉得还是看书比较好,可以前后翻看理解代码

aa05001 发表于 2014-10-1 08:40:43

嗯,非常感谢您的回复。我看了后面的小甲鱼的视频,就明白了。还是谢谢你。

大个的糖果 发表于 2014-11-1 03:47:52

页: [1]
查看完整版本: win32 课程中,源代码的不理解。请教