特殊说明:版权归个人所有,请勿转载,谢谢合作。
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。