转载地址: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并使用其中的类相关推荐

  1. C#通过反射动态加载dll,读取module、类、方法、特性,并通过反射+简单工厂+配置文件 实现ioc

    调用类: class Program {static void Main(string[] args){SafeInvoke(() =>{//通过委托实现通用的异常处理#region 通过反射创 ...

  2. C++的LoadLibrary动态加载dll

    1.导出接口 //抽象类 class CDev {virtual bool Ex_OPenDev()=0;virtual bool Ex_OPenDev()=0;//.. }HRESULT Creat ...

  3. 【原】 动态加载dll

    动态调用动态库步骤: 1.创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合. 2.通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄. 3. ...

  4. VC静态加载DLL和动态加载DLL

    VC静态加载DLL和动态加载DLL 1. 静态加载DLL 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头 ...

  5. Unity3D的坑系列:动态加载dll

    Unity3D的坑系列:动态加载dll 我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以 ...

  6. c# winform程序调用托管dll(c#的dll),使用添加引用和动态加载dll

    1. dll要强名. 2. winform程序要添加引用dll(自动获得dll的函数调用定义),"复制本地"属性设false,因为下一步会动态加载dll,所以"复制本地& ...

  7. C#根据Debug、Release模式动态加载dll

    //根据Debug.Release状态动态加载dll文件         #if (DEBUG)                 const string dllPathCamera = @" ...

  8. BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL

    以前没有封装dll动态库,接触新的工作之后需要用,折腾了一整天,终于搞定了 毕竟是生手,就简单分析注意点和遇到的一些问题及解决方案: (1)首先准备要生成DLL的工程. (1.1)我用的是BCB(C+ ...

  9. LoadLibrary无法加载.dll解决思路

    动态载入DLL所需要的三个函数详解(LOADLIBRARY,GETPROCADDRESS,FREELIBRARY) dll, lib, h的区别 dll是动态库, 将其链接进工程, 一般用LoadLi ...

最新文章

  1. squid日志文件太大,怎样处理?
  2. 人工智能简史(Rockwell Anyoha )
  3. 释疑の语法Unpackpack
  4. C语言工程实践-简单文本编辑器
  5. 【学习总结】Markdown 使用的正确姿势
  6. SQLAlchemy engine.Engine
  7. centos 怎样显示metric_centos7系列问题
  8. 神经网络中的分类器该如何改成生成器?
  9. 设置sqlplus 显示列数和行数
  10. Android之安装开发环境
  11. 复盘:什么是权重衰减?深度学习权重衰减
  12. persevere的用法_persevere和persist和insist的区别是什么?
  13. 计算机图形学的反走样
  14. 字体转换 (代码整理 备忘)
  15. OPENGL 半透明贴图
  16. VS2019安装时在“即将完成……一切准备就绪”界面闪退解决办法
  17. matlab 矩阵维度必须一致,错误使用 /
  18. 什么是MyBatis
  19. 麦克风阵列杂音很重解决方案(科大讯飞麦克风阵列+6.0)
  20. JVM学习 -- JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

热门文章

  1. 学习纪录片:三、消息队列下—RbbitMQ
  2. 游戏用户行为以及消费分析
  3. 个人隐私保护1:各种门事件层出不穷,如何保护个人隐私的安全
  4. Linux (centos7) 配置IP地址
  5. 如何选淘宝爆款产品和打造单品爆款的方法
  6. mysql.sock作用-解决mysql.sock直接找不到了的问题-重新生成mysql.sock
  7. 如何升级python的包_Python的包怎么升级
  8. 反工厂的零工族,他们的出路在哪里
  9. linux系统调整屏幕亮的时间,Linux系统的电脑上调整屏幕亮度的方法
  10. iOS 获取屏幕亮度和调整屏幕亮度的方法