能力值:
( LV2,RANK:10 )
|
-
-
26 楼
24楼
你说的
我在4楼写过。 但是我这人就喜欢钻牛角尖 不懂那个 返回值 强制转换 我是不瞑目的!
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
我前面提过,把函数指针进行转换后,唯一的区别是在调用时进行参数检查才会体现出来。
纯粹就赋值而言,因为指针都是32位的,在机器内部的二进制表示上是没有差异的,也就是说在汇编代码中并不体现。
|
能力值:
( LV9,RANK:610 )
|
-
-
29 楼
膜拜楼主的头像。。。
fly打你pp。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
哇咔咔,我倒没在意,期待fly大大一起来灌水。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
28楼大神谢谢了
这句“唯一的区别是在调用时进行参数检查才会体现出来。” 让我豁然开朗.
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
晕死我了,原来你问的是这个问题啊……囧,直接改成
typedef int (_stdcall *pFunc)(HWND,LPCTSTR,LPCTSTR,UINT)就是了嘛……晕死,形参而已……
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
从头看到尾,发现楼主好像是不理解指针函数和函数指针的问题。。。。那个GetProcAddress返回的是一个函数地址对吧,先不管返回的函数地址的参数是多少或者都是什么类型的,(void(*)(LPTSTR))这个你不要拆开看了,那个void的意思是说这个返回值是一个函数指针,指向的函数的返回值是void类型,该函数只有一个LPTSTR类型的参数。
我不知道LZ是不是问这个问题哦。。。不过MessageBoxA的参数和返回类型可不是这个,所以你即使这样强制类型转换后在调用的时候肯定是要崩溃的。
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
33楼 不是我想知道的!
你说的是函数指针的基本定义我知道,6楼例子说明了函数指针的基本定义用法.
问题已解决了.
|
|
|