面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:
(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。
图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所示。
图2 访问动态链接库中的C++类和资源
相关文章
- C++(20)类对象的动态建立和释放
- WPF中静态资源(StaticResource)和动态资源(DynamicResource)的区别
- C++ 类中的static成员的初始化和特点
- [转]C++ 类中的static成员的初始化和特点
- C/C++中动态链接库的创建和调用
- 使用dlopen和dlsym来使用C++中的类
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
- Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源
- VS C++动态链接库的创建使用(1) - 创建使用dll VS C++动态链接库的创建使用(1) - 创建使用dll查看程序依赖的动态库—dumpbin和depends
- Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式