一个进程内加载相同的多份DLL的问题

ldsjlzy 2008-07-30 03:30:54
有一样一个需求,一个进程内需要load一个dll的多个副本,即该进程需要加载多个相同的dll,该dll是第三方提供的不能修改,里面有一个init()初始化的函数,但load第二份dll时第二次调init()时会出错,因为init()内部有静态变量,与第一份dll内的冲突,有什么办法让不同dll副本不共享这些静态变量?
...全文
750 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
gjb711 2011-11-28
  • 打赏
  • 举报
回复
将DLL 复制一份 改名, 再加载就可以了
thenshesaid 2008-08-02
  • 打赏
  • 举报
回复
有这个需求,因为一个进程内测试这个动态库的多个实例运行起来后整个程序的性能

只能说诡异的TEST CASE
jyh_baoding 2008-08-01
  • 打赏
  • 举报
回复
动态库加载多份,就失去了他的意义啊,想点别的办法啊
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
既然是测试,那就按照软件实际运行的做法来测,如果软件实际运行就不存在这种情况,测试就没有意义了。
zgl7903 2008-07-30
  • 打赏
  • 举报
回复
在 CWinApp::InitInstance() 中加载
在 CWinApp::ExitInstance() 中释放
ldsjlzy 2008-07-30
  • 打赏
  • 举报
回复
有这个需求,因为一个进程内测试这个动态库的多个实例运行起来后整个程序的性能
vcPlayer 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 ldsjlzy 的帖子:]
有一样一个需求,一个进程内需要load一个dll的多个副本,即该进程需要加载多个相同的dll,该dll是第三方提供的不能修改,里面有一个init()初始化的函数,但load第二份dll时第二次调init()时会出错,因为init()内部有静态变量,与第一份dll内的冲突,有什么办法让不同dll副本不共享这些静态变量?
[/Quote]

为何要加载多个副本?
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
看来不是全局变量的问题,应该是有其它特殊操作,例如使用全局对象等,你先试试多进程吧,如果多进程也不行就只能改程序了。
Yofoo 2008-07-30
  • 打赏
  • 举报
回复
使用多个Dll时 不能用 lib来确定导出函数了

需要自己 GetProcAddress 来取得函数地址,

用lib会导致所有函数全部定位到同一个Dll, 所以会冲突
ldsjlzy 2008-07-30
  • 打赏
  • 举报
回复
如何让加载的dll副本具有独立的内存空间。
hxfjb 2008-07-30
  • 打赏
  • 举报
回复
自己hook一下dll 的init函数,第二次调用这个函数的时候,仅仅返回true就可以了。
WispyDeng 2008-07-30
  • 打赏
  • 举报
回复
不执行 DllMain 都不行,那就不是 LoadLibrary 是的 Init 问题吧
ldsjlzy 2008-07-30
  • 打赏
  • 举报
回复
每个dll内部在init的时候有一个防止多实例的实现,无非就是用一个全局变量作判断,因为是别人的dll,不能改。上面方法我都试过了不行
zhoujianhei 2008-07-30
  • 打赏
  • 举报
回复
感觉不是 静态变量 的问题,因为每个 静态变量 都在自己的DLL空间中。
WispyDeng 2008-07-30
  • 打赏
  • 举报
回复
第一次Load执行,第二次以上Load不执行不就得了?
stivenjia 2008-07-30
  • 打赏
  • 举报
回复
不执行dllmain不建议也许对方在dllmain内进行初始化呢?

你可以尝试将其手工映射到内存中
闪破风浪 2008-07-30
  • 打赏
  • 举报
回复
同步吗???
ldsjlzy 2008-07-30
  • 打赏
  • 举报
回复
即使改成其它名加载,但因为是同一进程内,所以每次调用每个dll的init()时静态变量就会冲突。
WispyDeng 2008-07-30
  • 打赏
  • 举报
回复
用 LoadLibraryEx ,第三个参数传 DONT_RESOLVE_DLL_REFERENCES,这样不执行 DllMain()
孤客天涯 2008-07-30
  • 打赏
  • 举报
回复
可以试试,前提dll为动态调用
class CIncDll //定义一个DLL的接口类
{
// 在该类中Load dll,获取dll函数地址相关操作。。。。
};

应用:
CIncDll *m_pDll = new CIncDll ;//用指针,申请空间
通过m_pDll访问DLL

加载更多回复(2)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧