一.typedef函数指针用法
1.简单的函数指针的应用
形式1:返回类型(*函数名)(参数表)char (*pFun)(int);
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
2.使用typedef更直观更方便
形式1:typedef 返回类型(*新类型)(参数表)typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
二.查看动态链接库信息
Dependency Walker (depends.exe)三.创建动态链接库
showDlg.h#include "stdafx.h"
#define EXPORT __declspec(dllexport)//导出函数
extern "C" EXPORT void __stdcall ShowDialog(char* pText);//extern "C" 防止C++编译器对函数名进行改编
ShowDlg.cpp
// ShowDlg.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "ShowDlg.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
void __stdcall ShowDialog(char* pText)
{
MessageBox(NULL,pText,"提示",0);
}
由于_stdcall是一种比较流行的函数调用约定,为了防止发生函数命名改变的情况,可以定义一个.def文件
ShowDlg.def
LIBRARY ShowDlg.dll//动态链接库名称
EXPORTS
ShowDialog = ShowDialog//导出的函数名=动态链接库内部函数名
四.调用动态链接库
1.动态调用
#include "stdafx.h"
#include "windows.h"
int main()
{
typedef void(__stdcall * funShowInfo)(char* pchData);
//形式1:typedef 返回类型(*新类型)(参数表)
HMODULE hMod = LoadLibrary("ShowDlg.dll");//加载
if (hMod != NULL)//判断加载是否成功
{
funShowInfo ShowInfo;//定义函数指针
ShowInfo = (funShowInfo)GetProcAddress(hMod, "ShowDialog");//获取动态链接库中的函数
if (ShowInfo)//判断函数指针是否为空
ShowInfo("皮皮虾的春天");//调用动态链接库中的函数
}
FreeLibrary(hMod);//卸载动态链接库
printf("DLL\n");
}
2.静态调用
需要三个文件,动态链接库文件ShowDlg.dll,动态链接库头文件ShowDlg.h,动态链接库lib文件ShowDlg.lib
#include "stdafx.h"
#include "windows.h"
#include "ShowDlg.h"
#pragma comment(lib,"ShowDlg.lib")
int main()
{
ShowDialog("静态调用");
printf("DLL\n");
}
源码
http://download.csdn.net/detail/greless/9853300