首页
社区
课程
招聘
函数指针与typedef
发表于: 2010-2-14 02:02 9236

函数指针与typedef

2010-2-14 02:02
9236
收藏
免费 0
支持
分享
最新回复 (33)
雪    币: 77
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
24楼
你说的
我在4楼写过。 但是我这人就喜欢钻牛角尖 不懂那个 返回值 强制转换 我是不瞑目的!
2010-2-14 14:55
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
用ASM模拟一下吧
假设如下:
ProcAdd 变量地址 0x402000
LibHandle 变量地址 0x402010
GetProcAddress IAT地址 0x401100
MessageBoxA 函数地址 0x778899AA
""MessageBoxA" 字符串地址 0x403000

ProcAdd=(void (*)(LPTSTR))GetProcAddress(LibHandle,"MessageBoxA");

push 403000h         ;"MessageBoxA"
push [402010h]       ;LibHandle
call [401100h]         ;GetProcAddress
                            ;执行后,eax=778899AAh
mov [402000h],eax   ;ProcAdd
2010-2-14 15:19
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
我前面提过,把函数指针进行转换后,唯一的区别是在调用时进行参数检查才会体现出来。
纯粹就赋值而言,因为指针都是32位的,在机器内部的二进制表示上是没有差异的,也就是说在汇编代码中并不体现。
2010-2-14 15:24
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
29
膜拜楼主的头像。。。
fly打你pp。。。
2010-2-14 16:32
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
哇咔咔,我倒没在意,期待fly大大一起来灌水。。。
2010-2-14 16:42
0
雪    币: 77
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
28楼大神谢谢了
这句“唯一的区别是在调用时进行参数检查才会体现出来。” 让我豁然开朗.
2010-2-14 17:14
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
晕死我了,原来你问的是这个问题啊……囧,直接改成
typedef int (_stdcall *pFunc)(HWND,LPCTSTR,LPCTSTR,UINT)就是了嘛……晕死,形参而已……
2010-2-14 17:25
0
雪    币: 209
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
从头看到尾,发现楼主好像是不理解指针函数和函数指针的问题。。。。那个GetProcAddress返回的是一个函数地址对吧,先不管返回的函数地址的参数是多少或者都是什么类型的,(void(*)(LPTSTR))这个你不要拆开看了,那个void的意思是说这个返回值是一个函数指针,指向的函数的返回值是void类型,该函数只有一个LPTSTR类型的参数。
我不知道LZ是不是问这个问题哦。。。不过MessageBoxA的参数和返回类型可不是这个,所以你即使这样强制类型转换后在调用的时候肯定是要崩溃的。
2010-2-14 22:34
0
雪    币: 77
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
33楼 不是我想知道的!
你说的是函数指针的基本定义我知道,6楼例子说明了函数指针的基本定义用法.
问题已解决了.
2010-2-14 23:15
0
游客
登录 | 注册 方可回帖
返回
//