起因是读不懂typedef void (*lpFun)(void); 这句,所以开始搜索学习。
同时可参照“用typedef定义类型总结。”http://blog.csdn.net/yjkwf/article/details/5445351
*****************************************************
下面的程序说明了函数指针调用函数的方法:
例一、
#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
int main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
*****************************************************
其中int (*ptr)(int, int); 定义了一个返回类型为int 参数为两个int的函数指针 ptr。
按照这种理解 typedef void (*lpFun)(void);
void (*lpFun)(void); 定义一个返回类型为void,参数为void的函数指针 lpFun.
该函数指针指向 类似于 void Foo(void)函数的函数入口地址、
lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");//指的是ShowDlg的返回为void 参数为void
定义一个函数指针类型。
比如你有三个函数:
void hello(void) { printf("你好!"); }
void bye(void) { printf("再见!"); }
void ok(void) { printf("好的!"); }
typdef void (*funcptr)(void);
这样就构造了一个通用的函数
你用的时候可以这样:
void speak(int id)
{
funcptr words[3] = {&hello, &bye, &ok};
funcptr fun = words[id];
(*fun)();
}
这样的话,如果speak(0)就会显示“你好!”
speak(1)就会显示“再见!”
speak(2)就会显示“好的!”
用于处理参数和返回值的形式都一样,但是功能不确定的一组函数,可以使用函数指针。
比如算术运算符,加、减、乘、除,都可以用typedef int (*calc)(int,int)代表,等等
比如:
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef void ( *funcptr)(void); //定义指针类型
void fun1(void) //定义函数一
{
cout << "This is fun1" << endl;
}
void fun2(void) 定义函数二
{
cout << "This is fun2" << endl;
}
int main()
{
funcptr p1; //定义了一个该类型的指针p1
p1 = fun1; //p1指向函数一
p1();
p1 = fun2; //p1指向函数二
p1();
system("pause");
}
HMODULE hModule=GetModuleHandle("kernel32.dll");
if (hModule)
{
typedef DWORD (CALLBACK
*LPFNREGISTER)(DWORD,DWORD);
LPFNREGISTER
lpfnRegister;
lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");
if
(lpfnRegister)
{
(*lpfnRegister)(NULL,1L);
}
}
typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD); 定义函数指针类型LPFNREGISTER 返回值类型DWORD 函数指针有两个DWORD类型的参数。
LPFNREGISTER lpfnRegister; 函数指针实例化。