使用Duilib做的程序封装成DLL的显示加载与卸载问题
一.前言:
最近在使用Duilib做一些客户端程序,有一些单一的模块也是使用Duilib做的,但是是封装成DLL的形式作为插件使用的,即使用的时候显式调用dll,加载显示,在不用的时候直接卸载dll,减少内存占用。
在此过程中遇见了一些较为扯淡的问题。
- 显示调用dll使用导出类与导出函数的选择。
- 作为插件加载的dll,在不需要使用的时候卸载dll时,会出现异常现象(崩溃或者其它)。
- 释放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的显示加载与卸载问题相关推荐
- 【转】将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- 怎么把java源代码封装,如何把JAVA程序封装成EXE文件
如何把JAVA程序封装成EXE文件 可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行.这样的工具常见的有JET和gcj.前者是收费的,而且做出来的exe还 ...
- matlab 打包封装,MATLAB程序封装成EXE文件
MATLAB程序封装成EXE文件 1.设置编译器: 首先需要配置自己的Matlab Compiler,Matlab Compiler的作用是将程序编译成为机器可以直接执行的程序.配置Compiler ...
- cordova 一个将web应用程序封装成app的框架
cordova 一个将web应用程序封装成app的框架 cordova的详细介绍请参考这个链接:http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建. ...
- 服务助手NSSM——将Windows程序封装成服务
文章目录 简介 安装 初试 删除服务 详细用法 服务依赖 进程优先级 关闭服务 退出和重启 I/O 文件轮换 环境变量 事件钩子 参考文献 简介 NSSM 可以将 Windows 程序封装成服务,当服 ...
- 将py程序封装成exe应用程序
想把自己写的 python 程序发给别人看,难道要把代码发给别人?但是别人却没有 python 的编译器,那该怎么办呢?那就要将自己写的程序封装成 exe 应用程序,使得在任何电脑上都能运行. 1.首 ...
- 把你的unity 工程中的cs文件封装成 dll
文章目录 1.打开Visual Studio 新建一个类库(.NET Framework) 项目 2.unity的dll引用:UnityEngine.dll 和 UnityEditor.dll 3.. ...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...
原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...
- java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)
相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...
- C#中动态加载和卸载DLL
在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...
最新文章
- time datetime
- go中 -strconv包的使用
- 装饰器设计模式的应用
- vcpkg安装_微软牌包管理器vcpkg更新及路线图计划
- python的六大数据类型中可以改变_在python中更改数组的数据类型
- 编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单
- 服务器物理链路,【交换机在江湖对接案例】配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法)...
- 岗位理解_如何正确理解策划岗位
- IntelliJ IDEA打开错误 _CGContextSetAllowsAcceleration
- could not extract ResultSet 错误
- 蓝色理想的flex教材不能在flex Development做不能使用,我整理一下供初学者参考
- python做数据透视表_利用Python进行数据分组/数据透视表
- cesium模型纹理替换
- python spider模块_spider【第三篇】python爬虫模块requests
- 线性代数 - 矩阵形式下的最小二乘法
- 多媒体计算机主要有哪些基本特性,多媒体计算机的基本特性
- 与人工智能相关的创业公司或团队
- 百万基建狂魔们的赛博世界
- c语言规定对于一个正常运行的c程序,下列叙述中正确的是,计算机二级C语言复习第*周...
- 复数神经网络_如果神经网络状态为复数会发生什么?
热门文章
- php开发技术规范怎么写,PHP开发技术规范!(2)
- 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
- centos7安装python2.6_centos7.2下yum和python重装问题及解决方法
- python help 函数_python怎么用help函数
- bim 骗局_建筑设计BIM工程师是个好职业吗?
- html视频播放 bootstrap,基于Bootstrap和jQuery的视频播放器插件
- 表格超出_?那些年Word表格你肯定踩过的坑
- c 打印二叉树_基础扩展 | 22. 遍历二叉树—前序遍历算法的VBA代码解析
- 关于调用Thread.sleep() 哪条线程休眠问题
- Super Mario HDU 4417 主席树区间查询