面我们来介绍如何访问动态链接库中的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++类和资源
时间: 2024-09-09 01:45:57
访问动态链接库中的C++类和资源的相关文章
如何使用动态链接库中的资源
近来在论坛上很有多帖子问到如何使用DLL中的资源(包括对话框,图标等)的问题,现在笔者就来就此问题谈谈,包含在DLL内部使用资源,DLL中使用其它DLL中的资源和在应用程序中使用资源. 我们先以图标为例说起(其它的资源与此图标的加载原理大致相同),我们要加载图标,一般是调用AfxGetApp()->LoadIcon(-):下面是CWinApp::LoadIcon的实现(afxwin2.inl): _AFXWIN_INLINE HICON CWinApp::LoadIcon(LPCT
C#中通过Assembly类访问程序集信息
C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法: 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名): 3.属性: FullName:程序集显示名称: 3.方法: GetTypes():获取程序集中定义的类型. TestAssembly.cs: view plaincopy to clipboardprint? using System; using Sys
Jboss中如何在不同应用间共享类和资源
Jboss中不同应用之间如何共享类和资源:通常如果希望在Jboss不同应用之间共享类和资源,我们应将类和资源放在jboss/server/default/lib/下面,这样所有的应用可以共享资源: Jboss中如果类和和资源放在不同的war包中,却想在不同的应用间何共享WAR包中WEB-INF/classes和WEB-INF/lib中的资源,能否做到哪? 可以通过jbossweb-tomcat-55.sar/META-INF/jboss-service.xml配置文件中配置属性UseJBossW
restlet-在基于spring的REST服务 中如何让每一个资源类中的 每个资源方法都有一个URL呢?
问题描述 在基于spring的REST服务 中如何让每一个资源类中的 每个资源方法都有一个URL呢? 如 在这一篇 博文中 http://my.oschina.net/jiyayun/blog/146446 每一个资源类中都只有一个 方法可用.如果我在一个资源类中有多个 资源方法应该怎么弄呢?求大神帮忙,谢谢了. 解决方案 因为每个类对应一个url如果是每个方法,那么就冲突了.你可以用代码生成器产生代理类,每个类对应一个原始类的方法来解决这个问题.
iis8中写权限和脚本资源访问权限在哪里设置
问题描述 iis8中写权限和脚本资源访问权限在哪里设置 iis6中可以设置虚拟目录或应用程序的"写权限"和"脚本资源访问权限",ii8在哪里设置这两个权限呢?
c++-C++中 不能在类中访问this的地址
问题描述 C++中 不能在类中访问this的地址 如class a{ public: void show(){ cout<<&this; }}如果this是一个指针,为什么不能访问它的地址? 解决方案 首先要搞清楚this指针是存放在哪的?编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同),也就是成员函数的其它参数正常都是存放在栈中,而this指针参数则是存放在寄存器中.寄存器不能像被外设寄存器
如何设置友类访问.cpp中变量,大概意思是.cpp中的对象名是什么?
问题描述 如何设置友类访问.cpp中变量,大概意思是.cpp中的对象名是什么? 是这样样子,我有一个data.h,相应地有data.cpp,再建立一个Save.h,相应地有Save.cpp. 目的显然就是想把data类里的数据通过save给导出来. 我的思路是,将save类设为data类的友类,可是如果在save.h,加入Data mydata,那么 只是新建一个新的对象而已,和data.cpp中的变量们完全没有关系,除了长的像. 我想是不是data.cpp中的变量是从属于data类下的一个对象
Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源
前言 Android动态加载(下)--加载已安装APK中的类和资源. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com Android中文Wiki:http://wikidroid.sinaapp.com 正文 一.目标 注意被调用的APK在Android系统中是已经安装的. 上篇文章:Android应用开发提高系列(4)--Android动态加载(上)--加载
无效的bean定义与类路径中定义的名字“数据源”资源[spring-mybatis]
问题描述 无效的bean定义与类路径中定义的名字"数据源"资源[spring-mybatis] 错误如下: Invalid bean definition with name 'dataSource' defined in class path resource [spring-mybatis.xml]: Could not resolve placeholder 'driver' in string value "${driver}"; nested except