使用LoadLibrary动态加载DLL并使用其中的类
转载地址:https://blog.csdn.net/hetoby/article/details/51941921
动态加载DLL并使用其中的函数,是大家经常用到的,那么直接使用LoadLibrary加载DLL来使用其中的类对象又该怎么做呢?本文给出方案&示例:
DLL - 头文件和导出方法
class IDLLIFsWrap
{
public:virtual void DeleteSelf(void) = 0;virtual int Add(int x, int y) = 0;
};extern "C" __declspec(dllexport) long CreateIFsWrapObj(IDLLIFsWrap** ppObj);
DLL - 目标类的定义和实现
class CMyDLLIFsWrap : public IDLLIFsWrap
{
public:CMyDLLIFsWrap();virtual ~CMyDLLIFsWrap();virtual void DeleteSelf(void);virtual int Add(int x, int y);
};long CreateIFsWrapObj(IDLLIFsWrap** ppObj)
{*ppObj = new CMyDLLIFsWrap();return 0;
}CMyDLLIFsWrap::CMyDLLIFsWrap()
{
}
CMyDLLIFsWrap::~CMyDLLIFsWrap()
{
}void CMyDLLIFsWrap::DeleteSelf(void)
{delete this;
}int CMyDLLIFsWrap::Add(int x, int y)
{return x + y;
}
Demo - 使用DLL
class CMyDemoDlg : public CDialogEx
{
... ...
public:afx_msg void OnBnClickedOk();afx_msg void OnClose();private:BOOL InitializeMyDLL();void UnInitializeMyDLL();private:HINSTANCE m_myDllHInst;IDLLIFsWrap* m_pIFsWrapObj;
}BOOL CMyDemoDlg::OnInitDialog()
{
... ...
InitializeMyDLL();
return TRUE;
}void CMyDemoDlg::OnClose()
{UnInitializeMyDLL();CDialogEx::OnClose();
}
void CMyDemoDlg::OnBnClickedOk()
{if (nullptr != m_pIFsWrapObj){int nRet = m_pIFsWrapObj->Add(3, 4);TRACE(_T("%d\n"), nRet);}
}BOOL CMyDemoDlg::InitializeMyDLL()
{typedef long (*FunCreateIFsWrapObj)(IDLLIFsWrap **pp_obj);m_myDllHInst = LoadLibrary(_T("MyDLL.dll"));if (nullptr == m_myDllHInst)return FALSE;FunCreateIFsWrapObj funCreateObj = (FunCreateIFsWrapObj)GetProcAddress(m_myDllHInst, "CreateIFsWrapObj");if (nullptr == funCreateObj){FreeLibrary(m_myDllHInst);m_myDllHInst = nullptr;return FALSE;}if (0 != funCreateObj(&m_pIFsWrapObj)){ASSERT(nullptr == m_pIFsWrapObj);FreeLibrary(m_myDllHInst);m_myDllHInst = nullptr;return FALSE;}ASSERT(nullptr != m_myDllHInst);ASSERT(nullptr != m_pIFsWrapObj);return TRUE;
}void CMyDemoDlg::UnInitializeMyDLL()
{if (nullptr != m_pIFsWrapObj){m_pIFsWrapObj->DeleteSelf();m_pIFsWrapObj = nullptr;}if (nullptr != m_myDllHInst){FreeLibrary(m_myDllHInst);m_myDllHInst = nullptr;}
}
使用LoadLibrary动态加载DLL并使用其中的类相关推荐
- C#通过反射动态加载dll,读取module、类、方法、特性,并通过反射+简单工厂+配置文件 实现ioc
调用类: class Program {static void Main(string[] args){SafeInvoke(() =>{//通过委托实现通用的异常处理#region 通过反射创 ...
- C++的LoadLibrary动态加载dll
1.导出接口 //抽象类 class CDev {virtual bool Ex_OPenDev()=0;virtual bool Ex_OPenDev()=0;//.. }HRESULT Creat ...
- 【原】 动态加载dll
动态调用动态库步骤: 1.创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合. 2.通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄. 3. ...
- VC静态加载DLL和动态加载DLL
VC静态加载DLL和动态加载DLL 1. 静态加载DLL 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头 ...
- Unity3D的坑系列:动态加载dll
Unity3D的坑系列:动态加载dll 我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以 ...
- c# winform程序调用托管dll(c#的dll),使用添加引用和动态加载dll
1. dll要强名. 2. winform程序要添加引用dll(自动获得dll的函数调用定义),"复制本地"属性设false,因为下一步会动态加载dll,所以"复制本地& ...
- C#根据Debug、Release模式动态加载dll
//根据Debug.Release状态动态加载dll文件 #if (DEBUG) const string dllPathCamera = @" ...
- BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL
以前没有封装dll动态库,接触新的工作之后需要用,折腾了一整天,终于搞定了 毕竟是生手,就简单分析注意点和遇到的一些问题及解决方案: (1)首先准备要生成DLL的工程. (1.1)我用的是BCB(C+ ...
- LoadLibrary无法加载.dll解决思路
动态载入DLL所需要的三个函数详解(LOADLIBRARY,GETPROCADDRESS,FREELIBRARY) dll, lib, h的区别 dll是动态库, 将其链接进工程, 一般用LoadLi ...
最新文章
- squid日志文件太大,怎样处理?
- 人工智能简史(Rockwell Anyoha )
- 释疑の语法Unpackpack
- C语言工程实践-简单文本编辑器
- 【学习总结】Markdown 使用的正确姿势
- SQLAlchemy engine.Engine
- centos 怎样显示metric_centos7系列问题
- 神经网络中的分类器该如何改成生成器?
- 设置sqlplus 显示列数和行数
- Android之安装开发环境
- 复盘:什么是权重衰减?深度学习权重衰减
- persevere的用法_persevere和persist和insist的区别是什么?
- 计算机图形学的反走样
- 字体转换 (代码整理 备忘)
- OPENGL 半透明贴图
- VS2019安装时在“即将完成……一切准备就绪”界面闪退解决办法
- matlab 矩阵维度必须一致,错误使用 /
- 什么是MyBatis
- 麦克风阵列杂音很重解决方案(科大讯飞麦克风阵列+6.0)
- JVM学习 -- JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解
热门文章
- 学习纪录片:三、消息队列下—RbbitMQ
- 游戏用户行为以及消费分析
- 个人隐私保护1:各种门事件层出不穷,如何保护个人隐私的安全
- Linux (centos7) 配置IP地址
- 如何选淘宝爆款产品和打造单品爆款的方法
- mysql.sock作用-解决mysql.sock直接找不到了的问题-重新生成mysql.sock
- 如何升级python的包_Python的包怎么升级
- 反工厂的零工族,他们的出路在哪里
- linux系统调整屏幕亮的时间,Linux系统的电脑上调整屏幕亮度的方法
- iOS 获取屏幕亮度和调整屏幕亮度的方法