12.4 DLL动态加载

特殊说明:版权归个人所有,请勿转载,谢谢合作。

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 程序执行结果

参考文献

  1. 百度百科
  2. 王艳平, 张铮. WINDOWS程序设计(第2版). 北京: 人民邮电出版社, 2008
  3. 黄维通. Visual C++ 面向对象与可视化程序设计(第2版). 北京: 清华大学出版社,2007

 

转载请附上原文出处链接及本声明
李老师的博客 » 12.4 DLL动态加载

发表评论

提供最优质的文章集合

立即查看 了解详情