访问动态链接库中的C++类和资源
2023-09-27 14:28:16 时间
面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。 图1 对话框资源设计窗口(2)定义一个名称为CTextDlg的抽象类,因为需要访问动态链接库中的CTextDlg类,因此客户端需要定义一个框架,即抽象类CTextDlg。
面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:
(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。
![](https://yqfile.alicdn.com/img_e633a0489f1c06f7606edf24cc61f97f.jpg)
图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所示。
![](https://yqfile.alicdn.com/img_2fb514882979f9c082afc9dcc58c149a.jpg)
图2 访问动态链接库中的C++类和资源
C#&.net系列之——C#如何动态加载调用C++动态链接库?非常简单!!! 今天介绍动态调用的方法。很多时候,Dll库的目录可能是变化的,或是有些场景,需要根据具体的情况,来动态加载这些Dll库。这样使用静态调用的方式就很不方便,C#中我们经常通过配置动态的调用托管Dll,那么是不是也可以这样动态调用C++动态链接呢? 只要通过LoadLibrary, GetProcess, FreeLibrary这几个函数是可以动态调用动态链接的(它们包含在kernel32.dll中)。
面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:
(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。
![](https://yqfile.alicdn.com/img_e633a0489f1c06f7606edf24cc61f97f.jpg)
图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所示。
![](https://yqfile.alicdn.com/img_2fb514882979f9c082afc9dcc58c149a.jpg)
图2 访问动态链接库中的C++类和资源
C#&.net系列之——C#如何动态加载调用C++动态链接库?非常简单!!! 今天介绍动态调用的方法。很多时候,Dll库的目录可能是变化的,或是有些场景,需要根据具体的情况,来动态加载这些Dll库。这样使用静态调用的方式就很不方便,C#中我们经常通过配置动态的调用托管Dll,那么是不是也可以这样动态调用C++动态链接呢? 只要通过LoadLibrary, GetProcess, FreeLibrary这几个函数是可以动态调用动态链接的(它们包含在kernel32.dll中)。
相关文章
- C/C++数据结构(九) —— 链式二叉树
- C++之多态【详细总结】
- C/C++-编译:链接【静态链接(由链接器在链接时将库的内容加入到可执行程序中)】、【动态链接(链接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序)】
- C++资源大全
- 最好的朋友:C++11移动语义和Pimpl手法
- [c++] Highly Proficient Implementation List for Bayes
- C++——构造函数 constructor
- undefined reference to typeinfo - C++ error message
- lua的入门教程-- C++(三)
- C++ Vector遍历的几种方式及修改元素值
- 超硬核!十万字c++题,让你秒杀老师和面试官(上)
- 将C++资源文件读取出来
- vc++ PC微信 逆向HOOK接口
- C++的单例模式
- C++11使用emplace_back代替push_back
- C/C++ 框架,类库,资源集合
- C++转换unicode utf-8 gb2312编码
- C++函数的哑元参数
- 【温故而知新】C和C++6:STL中的vector容器
- 【C++】学习C++中的继承
- Learning C++ No.20 【红黑树实战】
- C++ 用libcurl库进行http 网络通讯编程
- linux安装Eclipse c++环境