duilib 同一个进程多个DLL使用问题

duilib库自己现在用的蛮舒服的,全部的代码自己也看几遍,对自己开发UI帮助蛮多。duilib一个小巧的directui库,基本满足能大部分开发。虽然有一些BUG,但不影响开发,只要自己明白的他的库原理其他就容易了。

自己开发当中时候为了使模块更加模块话,我直接把界面和业务封装在一个DLL里面,资源都放在压缩包里面并做为DLL的资源。对外只提供接口,就算需求变化了,要修改界面,但对外面来说,接口不变,他们什么都知道,这样降低耦合性。但项目开发当中发现我启动一个用DUILIB模块界面后,前面界面关闭不关闭后面你要启动另一个DUILIB写的DLL里面的界面,你会发现根本启动不了,过了一会就调试一个ASSERT(pRoot) 的诊断报错。我觉得很奇怪,我以前用MFC这样开发时候没有发现这样的问题。觉得一点的不科学。后面想到一个进程公用一个DLL,一个进程中内存是一样的。所以猜测用了全部变量。

自己后来分析Core里面 CPaintManagerUI ,里面有大量的类的静态变量,显然对应CPaintManagerUI  所有的实例是公用的。

static HINSTANCE m_hInstance;

static HINSTANCE m_hResourceInstance;

static CDuiString m_pStrResourcePath;

static CDuiString m_pStrResourceZip;

static bool m_bCachedResourceZip;

static HANDLE m_hResourceZip;

static short m_H;

static short m_S;

static short m_L;

static CStdPtrArray m_aPreMessages;

static CStdPtrArray m_aPlugins;

后面分析 m_hInstance 是有问题,每个DLL都有自己不同的m_hInstance ,除非我自己放EXE里面公用EXE的资源。显然DUILIB 作者根本没有考虑多DLL访问问题,估计没有考虑DUILIB在DLL的使用,只考虑在exe使用了。

我的解决办法:我不修改作者原来的代码,懒的麻烦。每个模块的DLL 对应的一个duilib的DLL ,但名字不是一样,因为同一个进程只能加载一份DLL。

这样就每个进程加载同一个DLL环境一样了。比喻直播模块:生成Duilib_Live。录播模块就要Duilib_Play,反正DUILIB 也不大,对程序大小没有太大影响。

duilib在自定义控件时候visit 默认是false,很多时候不注意就会发现怎么窗口不显示呢。。。

MFC 能够很好的与DUILIB结合,具体可以看网上哥们写的迅雷播放器的教程。

MFC 在DLL注意点有好多,一个就是句柄问题,每次创建时候要AFX_MANAGE_STATE(AfxGetStaticModuleState());

而且窗口对象不是栈上,一定要堆上,不然就会报错,自己没有具体找到他的原因,能用就行了。MFC 兼容太多东西,所以也不要说MFC不好。

时间: 2024-11-01 22:21:33

duilib 同一个进程多个DLL使用问题的相关文章

学习笔记之卸载远程目标进程中的DLL模块(转)

学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02) 转载▼ 学习笔记之卸载远程目标进程中的DLL模块2007/7/231.首先得把DLL模块中的线程结束使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);创建系统线程的快照然后用Thread32First()和Thread32Next()遍历系统中所有线程.将遍历到的线程保存到THREADENTRY32结构,然后判断结构中的th32OwnerProcessID成员是否与

创建进程时注入DLL

#include "stdafx.h" #include <Windows.h> // 函数声明 typedef BOOL (WINAPI* Proc_CreateProcessW)(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInherit

通过共享用户ID来实现多个应用程序使用同一个进程

从很多方面来看,每个Android 应用程序都存在于它自己的世界之中:• 默认情况下,每个应用程序均运行于它自己的Linux 进程中.当应用程序中的任意代码开始执行时,Android 启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程.• 每个进程都运行于自己的Java 虚拟机(VM)中.所以应用程序代码实际上与其它应用程序的代码是隔绝的.• 默认情况下,每个应用程序均被赋予一个唯一的Linux 用户ID,并加以权限设置,使得应用程序的文件仅对这个用户.这个应用程序可

获取系统进程信息和进程依赖的dll信息

body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { color: #000000; background-color: #C2E7C7; } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { font-size:1.3em; fon

同一个进程内的队列(多线程) 线程池

一.同一个进程内的队列(多线程) import queue queue.Queue()   先进先出 queue.LifoQueue()  后进先出 queue.PriorityQueue()   优先级队列 优先级队列   q = queue.PriorityQueue() q.put((pri , data))   接收的是一个元祖 元祖中第一个参数是:表示当前数据的优先级 元祖中第二个参数是:需要存放到队列中的数据 优先级的比较(首先保证整个队列中,所有表示优先级的东西类型必须一致) 如果

2.添加键盘钩子。向进程中注入dll

学习笔记 1.首先要建立mfc的动态链接库.在def文件中放入要导出的函数名. 2.添加函数如下 //安装钩子 //HHOOK SetWindowsHookEx( // int idHook,//钩子的类型WH_KEYBOARD键盘钩子 // HOOKPROC lpfn,//钩子的回调函数,钩子类型不同回调函数不同 // HINSTANCE hwnd,//dll动态链接库的句柄 // DWORD dwthreadid//游戏主进程的id 是GetWindowThreadProcessId的返回值

C#卸载加载到进程里的dll

参考 DLL卸载 VC实现DLL注入之DLL卸载 CreateToolhelp32Snapshot (kernel32) CreateToolhelp32Snapshot函数 原文地址:https://www.cnblogs.com/code1992/p/11663090.html

恶意代码分析工具(进程信息、dll注入、PE解析等)

ActiveX开发

转自(http://blog.csdn.net/mingojiang/article/details/8159263) 一.ActiveX基础 1.1什么是ActiveX ActiveX是COM规范的一种实现,前身是OLE(Object Linking and Embedding).一般读成:ActiveX Ctronl,译成:ActiveX控制,ActiveX控件.即可用于桌面也可用于网络,是封装.跨平台(兼容)与重用技术的延伸.封装与重用技术大概经历了以下几个历史阶段: 明码复用:就是写的代