天天看点

访问动态链接库中的C++类和资源

面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:

(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。

访问动态链接库中的C++类和资源

图1  对话框资源设计窗口

(2)定义一个名称为CTextDlg的抽象类,因为需要访问动态链接库中的CTextDlg类,因此客户端需要定义一个框架,即抽象类CTextDlg。

class CTextDlg             //定义抽象类CTextDlg

{

public:

 virtual void __stdcall ShowTextDlg(char* pchText) = 0;  //定义纯虚方法

};

(3)定义两个函数指针,用于关联动态链接库中的全局函数。

typedef CTextDlg*   (__stdcall *funGetTextDlg)();    //定义函数指针类型

typedef void  ( __stdcall *funReleaseTextDlg)(CTextDlg* pTextDlg); //定义函数指针类型

(4)处理“确定”按钮的单击事件,访问动态链接库中CTextDlg类的方法,并加载动态链接库中的位图资源。

void CAccessDllDlg::OnOK() 

 HMODULE hMod = LoadLibrary("ClassDll.dll");   //加载动态链接库

 if (hMod != NULL)        //判断是否加载成功

 {

  //获取动态链接库中的GetTextDlg函数

  funGetTextDlg GetTextDlg = (funGetTextDlg)GetProcAddress(hMod,"GetTextDlg");

  funReleaseTextDlg ReleaseTextDlg= (funReleaseTextDlg)GetProcAddress(hMod,

"ReleaseTextDlg");//获取动态链接库中的ReleaseTextDlg 函数

  if (GetTextDlg != NULL && ReleaseTextDlg != NULL) //判断函数指针是否为空

  {

   CTextDlg* pTextDlg =  GetTextDlg();  //调用动态链接库中的方法,构造CTextDlg对象

   pTextDlg->ShowTextDlg("编程词典");  //访问CTextDlg类的ShowTextDlg方法

   ReleaseTextDlg(pTextDlg);    //释放pTextDlg对象

  }

  FreeLibrary(hMod);       //卸载动态链接库

 }

 //加载动态链接库

HMODULE hRes = LoadLibraryEx("ClassDll",NULL,LOAD_LIBRARY_AS_DATAFILE);

 if (hRes != NULL)        //判断是否加载成功

  //加载动态链接库中的位图,其中2000为动态链接库中的位图资源ID值

HANDLE hBmp = LoadImage(hRes,MAKEINTRESOURCE(2000),IMAGE_BITMAP,0,0,0);

  if (hBmp != NULL)       //判断加载位图是否成功

   m_BK.SetBitmap((HBITMAP)hBmp);   //在空间中显示位图

  FreeLibrary(hRes);       //卸载动态链接库

}

 提示:为了获取动态链接库中的资源,我们需要使用LoadLibraryEx函数以数据文件的形式加载动态链接库。

(5)运行程序,单击“确定”按钮,效果如图2所示。

访问动态链接库中的C++类和资源

图2  访问动态链接库中的C++类和资源

继续阅读