多线程中加载DLL 问题

sea_sharka_17 2008-03-18 11:35:12
在多线程里面加载同一个DLL动态库,在每个线程中都使用LoadLibrary来调用同一个动态库,但是,在所有的线程中,HINSTANCE的返回结果都是一样的,动态库中的接口在每个线程中也是一样的;
如果,动态库中的处理时间和周期很长,每个线程中处理的结果都是错误的;
请问在多线程中调用同一个动态库,HINSTANCE的返回值为什么是一样的???
如何解决???
...全文
288 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-03-18
  • 打赏
  • 举报
回复
HINSTANCE指的是什么?
LoadLibrary的返回值是HMODULE类型,实际上就是dll模块开始的内存地址,dll一旦映射到进程地址空间中,它的地址就是固定的了,所以每次LoadLibrary返回的都是同一个值,除非dll完全释放并再次加载才有可能改变。
snowdot84 2008-03-18
  • 打赏
  • 举报
回复
如果DLL的函数里使用了公有变量,或静态变量,才要考虑同步问题。
其它的就放心使用好了。
jameshooo 2008-03-18
  • 打赏
  • 举报
回复
一个DLL在EXE中只会被加载一次,再次调用LoadLibrary仅仅增加模块句柄的引用计数而已,所以无需每个线程都调用LoadLibrary,可以直接使用句柄,或者用GetModuleHandle来获取已加载DLL的句柄。
而且DLL被加载后,导出符号都已经重定位成功,其它线程可以直接调用这些导出函数,连句柄都不需要了。
但是DLL实现者就要注意了,自己的导出函数在被不同线程调用,所以需要考虑线程同步。
ouyh12345 2008-03-18
  • 打赏
  • 举报
回复
dll里不要使用公有变量和静态变量
如果有的话,注意同步的问题
ouyh12345 2008-03-18
  • 打赏
  • 举报
回复
dll只在第一此加载到进程里,以后的加载,只是增加它的引用次数
看dll的WinMain函数:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
snowdot84 2008-03-18
  • 打赏
  • 举报
回复
DLL是被加载到进程空间的,LoadLibrary返回的值是 DLL加载到的进程空间地址,所以都是一样的。这和多线程没有关系。

15,471

社区成员

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

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