特殊说明:版权归个人所有,请勿转载,谢谢合作。
12.4 DLL动态加载
动态链接是在程序运行时刻定位外部DLL函数的可执行代码进程,如图12.15所示。

- 图12.15 动态加载原理图
动态加载方式只需要将DLL文件拷贝到当前工程目录下即可(本例为“Calc.dll”),如图12.16所示。

- 图12.16 拷贝动态链接需要的文件
动态加载方式比静态加载方式复杂一些,首先,需要定义函数的指针,函数指针的参数与算法函数要统一;其次,是加载DLL文件,DLL文件加载成功后,就可以使用GetProcAddress函数得到相应的算法函数在内存中的地址;再次,通过函数指针的方式调用相应的函数;最后,释放DLL文件。DLL文件的加载与释放是成对出现的,在编写程序时一定要注意。具体代码如下:
#include <windows.h>
#include <stdio.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szBuffer[128] = { 0 }; // 临时缓冲区
int nOp1 = 10; // 操作数1
int nOp2 = 5; // 操作数2
// 引出动态库中算法函数的指针
typedef int(*DLL_ADD)(int nOp1, int nOp2);
typedef int(*DLL_DEC)(int nOp1, int nOp2);
typedef int(*DLL_MUL)(int nOp1, int nOp2);
typedef int(*DLL_DIV)(int nOp1, int nOp2);
// 声明函数指针
DLL_ADD pfAddDll = NULL;
DLL_DEC pfDecDll = NULL;
DLL_MUL pfMulDll = NULL;
DLL_DIV pfDivDll = NULL;
// 加载DLL文件
HINSTANCE hdllHandle = LoadLibrary("Calc.dll");
if(hdllHandle == NULL)
MessageBox(NULL, "DLL加载失败。", "提示", MB_OK);
// 获得DLL中相应函数的地址
pfAddDll = (DLL_ADD)GetProcAddress(hdllHandle, "MyAdd");
pfDecDll = (DLL_DEC)GetProcAddress(hdllHandle, "MyDec");
pfMulDll = (DLL_MUL)GetProcAddress(hdllHandle, "MyMul");
pfDivDll = (DLL_DIV)GetProcAddress(hdllHandle, "MyDiv");
if(pfAddDll == NULL || pfDecDll == NULL ||
pfMulDll == NULL || pfDivDll == NULL)
{
MessageBox(NULL, "算法函数加载失败。", "提示", MB_OK);
}//end if
// 执行算法操作,这里应用的是函数指针。
sprintf(szBuffer, "加法:%d\r\n减法:%d\r\n乘法:%d\r\n除法:%d",
pfAddDll(nOp1, nOp2),
pfDecDll(nOp1, nOp2),
pfMulDll(nOp1, nOp2),
pfDivDll(nOp1, nOp2));
// 显示操作结果
MessageBox(NULL, szBuffer, "Dll加载示例", MB_OK);
// 释放DLL
FreeLibrary(hdllHandle);
return 0;
}
程序执行结果如图12.17所示。

- 图12.17 程序执行结果
参考文献
- 百度百科
- 王艳平, 张铮. WINDOWS程序设计(第2版). 北京: 人民邮电出版社, 2008
- 黄维通. Visual C++ 面向对象与可视化程序设计(第2版). 北京: 清华大学出版社,2007
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。