1:新建一个空的动态链接库工程(动态调用外部dll类方法,必须在该类的程序中写出具体导出函数(标红的部分),外部程序直接调用dll类中导出的函数(标蓝的部分))。
2: 为该工程添加一个C++头文件:XX.h
给导出的类Point添加标识符(_declspec(dllexport))用于导出
class _declspec(dllexport) Point
{
public:
void output(int x,int y);
};
3:为该工程添加一个C++源文件:XX.cpp
void Point::output(int a ,int b)
{
//返回调用者进程当前正在使用的那个窗口的句柄
HWND hwnd=GetForegroundWindow();
//获取DC
HDC hdc=GetDC(hwnd);
char buf[20];
memset(buf,0,20);
sprintf(buf,"x=%d,y=%d",a,b);
//输出坐标
TextOut(hdc,0,0,buf,strlen(buf));
//释放DC
ReleaseDC(hwnd,hdc);
}
extern "C" _declspec(dllexport) void show(int a,int b) //用于外部主程序调用类的方法
{
Point pt;
pt.output(a,b);
}
4:将每次更新动态链接库Debug文件中的ClassDll.dll,ClassDll.lib拷贝到主程序的根目录下
注意:(动态加载动态链接库:不需要将生成动态链接库文件中的头文件加载到调用程序中,同时也不需要将.lib文件复制到调用文件的根目录下。只需要将.dll复制到调用文件的根目录下即可)
5:程序调用(因为动态链接库中show函数前加入extern "C"(如上标红的代码)因此名字导出时不发生名字改编也就是不会变成?show@@YAXHH@Z(参考Doc使用dumpbin导入数据……文档),所以在调用程序中GetProcAddress函数的参数直接写为show(如果动态链接库中show函数发生名字改编则调用程序中GetProcAddress参数为?show@@YAXHH@Z))
void CTestDlg::OnButAdd()
{
HINSTANCE hInst; //定义一个实例句柄对象
hInst=LoadLibrary("ClassDll.dll"); //动态加载Dll
typedef void (*ADDPROC)(int a,int b); //定义函数指针类型
ADDPROC Output=(ADDPROC)GetProcAddress(hInst,"show");//调用dll类中的方法
if(!Output)
{
MessageBox("获取函数地址失败");
return;
}
Output( 90, 9);
}
作者:biolee 总结于:10.6.18 发表于:10.7.16