一.前言:

最近在使用Duilib做一些客户端程序,有一些单一的模块也是使用Duilib做的,但是是封装成DLL的形式作为插件使用的,即使用的时候显式调用dll,加载显示,在不用的时候直接卸载dll,减少内存占用。

在此过程中遇见了一些较为扯淡的问题。

  1. 显示调用dll使用导出类与导出函数的选择。
  2. 作为插件加载的dll,在不需要使用的时候卸载dll时,会出现异常现象(崩溃或者其它)。
  3. 释放Dll时计数问题

二.问题总结

1.显示调用dll使用导出类与导出函数的选择

在使用Dll时一般会使用导出类或者导出函数的方式,在使用隐式调用dll时这两种方式都可以随意使用,但是当你需要显式调用Dll时,导出类就明显不能得心应手,会有很多问题,实现起来也较为麻烦,不是明智之举

此时选择导出函数的方式最为可靠。

 隐式调用DLL:使用导出类或者导出函数都很合适(个人感觉导出类较为方便)。

 显式调用Dll:使用导出函数的方式,因为GetProcess获取函数地址时较为方便,导出类则很麻烦。

2.作为插件加载的dll,在不需要使用的时候卸载dll时,会出现异常现象(崩溃或者其它)

dll释放需要先释放dll中的一些资源(窗口句柄,其它资源等),我在使用Duilib程序封装的DLL时,在没关闭duilib窗口之前释放dll,会导致程序崩溃,内存泄漏等问题,

类似于窗口需要向窗口本身而不是父窗口发送WM_CLOS消息,而且只能使用SendMessage,不能使用PostMessage,因为SendMessage是阻塞的,会处理完消息之后再返回,而PostMessage是不管消息处理结果直接返回的。在卸载Duilib的dll时,如果在WM_CLOSE消息没有处理完(也就是窗口资源没释放掉),就Freelibrary肯定会导致一些内存泄漏问题。一些不带有窗口资源的DLL使用就没有这些操作就可以直接Freelibrary。

Duilib程序封装的Dll卸载:

  1.首先在主程序通过DLL窗口句柄向dll窗口发送WM_CLOSE消息,请求关闭窗口,释放资源  

::SendMessage(m_DllWindowsHwnd, WM_CLOSE, (WPARAM)0, 0);  //必须使用SendMessage,确保消息处理完再卸载DLL。否则会出现异常

2.然后释放Dll(注意Dll的加载计数,loadLibrary几次需要几次Freelibrary)

FreeLibrary(m_Dll);

3.释放Dll时计数问题

一个Dll在被某一个进程加载时,DLL其实只被加载过一次,每加载一次,内部会有一个加载计数

即loadLibrary  == 计数+1

Freelibrary == 计数-1

只有当计数=0时,dll才会被卸载,即不会映射到进程的内存空间

使用Duilib做的程序封装成DLL的显示加载与卸载问题相关推荐

  1. 【转】将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  2. 怎么把java源代码封装,如何把JAVA程序封装成EXE文件

    如何把JAVA程序封装成EXE文件 可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行.这样的工具常见的有JET和gcj.前者是收费的,而且做出来的exe还 ...

  3. matlab 打包封装,MATLAB程序封装成EXE文件

    MATLAB程序封装成EXE文件 1.设置编译器: 首先需要配置自己的Matlab Compiler,Matlab Compiler的作用是将程序编译成为机器可以直接执行的程序.配置Compiler ...

  4. cordova 一个将web应用程序封装成app的框架

    cordova 一个将web应用程序封装成app的框架 cordova的详细介绍请参考这个链接:http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建. ...

  5. 服务助手NSSM——将Windows程序封装成服务

    文章目录 简介 安装 初试 删除服务 详细用法 服务依赖 进程优先级 关闭服务 退出和重启 I/O 文件轮换 环境变量 事件钩子 参考文献 简介 NSSM 可以将 Windows 程序封装成服务,当服 ...

  6. 将py程序封装成exe应用程序

    想把自己写的 python 程序发给别人看,难道要把代码发给别人?但是别人却没有 python 的编译器,那该怎么办呢?那就要将自己写的程序封装成 exe 应用程序,使得在任何电脑上都能运行. 1.首 ...

  7. 把你的unity 工程中的cs文件封装成 dll

    文章目录 1.打开Visual Studio 新建一个类库(.NET Framework) 项目 2.unity的dll引用:UnityEngine.dll 和 UnityEditor.dll 3.. ...

  8. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...

    原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...

  9. java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...

  10. C#中动态加载和卸载DLL

    在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...

最新文章

  1. time datetime
  2. go中 -strconv包的使用
  3. 装饰器设计模式的应用
  4. vcpkg安装_微软牌包管理器vcpkg更新及路线图计划
  5. python的六大数据类型中可以改变_在python中更改数组的数据类型
  6. 编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单
  7. 服务器物理链路,【交换机在江湖对接案例】配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法)...
  8. 岗位理解_如何正确理解策划岗位
  9. IntelliJ IDEA打开错误 _CGContextSetAllowsAcceleration
  10. could not extract ResultSet 错误
  11. 蓝色理想的flex教材不能在flex Development做不能使用,我整理一下供初学者参考
  12. python做数据透视表_利用Python进行数据分组/数据透视表
  13. cesium模型纹理替换
  14. python spider模块_spider【第三篇】python爬虫模块requests
  15. 线性代数 - 矩阵形式下的最小二乘法
  16. 多媒体计算机主要有哪些基本特性,多媒体计算机的基本特性
  17. 与人工智能相关的创业公司或团队
  18. 百万基建狂魔们的赛博世界
  19. c语言规定对于一个正常运行的c程序,下列叙述中正确的是,计算机二级C语言复习第*周...
  20. 复数神经网络_如果神经网络状态为复数会发生什么?

热门文章

  1. php开发技术规范怎么写,PHP开发技术规范!(2)
  2. 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
  3. centos7安装python2.6_centos7.2下yum和python重装问题及解决方法
  4. python help 函数_python怎么用help函数
  5. bim 骗局_建筑设计BIM工程师是个好职业吗?
  6. html视频播放 bootstrap,基于Bootstrap和jQuery的视频播放器插件
  7. 表格超出_?那些年Word表格你肯定踩过的坑
  8. c 打印二叉树_基础扩展 | 22. 遍历二叉树—前序遍历算法的VBA代码解析
  9. 关于调用Thread.sleep() 哪条线程休眠问题
  10. Super Mario HDU 4417 主席树区间查询