关于函数指针的一点东西

最近一直在研究端口与进程的映射问题,然后就涉及到很多底层API的操作,尤其是ntdll和IPHLPAPI中微软未公布的API,自然用到的方法是LoadLibrary和GetProcAddress,这里面就涉及到函数指针的用法,今天专门google了下:

第一种:

 

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void (*PFun)();
 5 
 6 void Fun()
 7 {
 8     cout<<"This is a TEST"<<endl;
 9 }
10 
11 int main()
12 {
13     Fun();
14     PFun = Fun;
15     PFun();
16     (*PFun)();    
17 }
18 

 

其运行结果为:

 

毫无疑问的说,函数名其实对应着函数在代码段的首地址,可以这么理解

所以地址直接的复制自然可以,尤其是你弄明白汇编下的调用后:

Push a

Push b

Call 0x0o

这种形式,自然明白那个0x0o位置对应得是函数的首地址..。

第二种:

 

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef void (*PFun)();
 5 
 6 void Fun()
 7 {
 8     cout<<"This is a TEST"<<endl;
 9 }
10 
11 int main()
12 {
13     Fun();
14     PFun p;
15     p = Fun;
16     PFun(); //这么写不会报错,但是也没有执行任何代码
17     (*p)();    
18     p();
19 }
20 

 

 

其运行结果为:

 

 

与方法一一样,PFun()并没有任何可执行的代码..

借用一句话:typedef的功能是定义新的类型。

 

恩,就是这样子了

       以后想用0x0o这个ID老,NewSketcher以后再用..。

                  ------by   0x0o@Live.Cn

                       Time: 08.10.24   13;32

posted @ 2008-10-24 13:40  端木  阅读(269)  评论(0编辑  收藏  举报