LoadLibrary 998

delphihero 2008-01-05 02:03:16
这个dll第一次调用 LoadLibrary 是成功能一切正常。通过FreeLibrary释放它后。再调用 LoadLibrary 加载它结果访问违规。期间不调用任何dll内函数都一样。有谁知道大概的原因吗??
...全文
217 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
delphihero 2008-01-09
郁闷。因为工程和dll包含了vld。结果这个东西在dll卸载的时候没有卸载。导致不能再load
  • 打赏
  • 举报
回复
jameshooo 2008-01-05
你的EXE针对这个DLL有用到延迟加载/卸载特性吗?如果用到了,则不能直接调用FreeLibrary,因为它仅仅卸载模块,并不清除导出函数在地址空间中的映射表,重新加载时会导致访问违规。
既然你要继续使用DLL,为何非要FreeLibrary呢?用完了再卸载不行吗?
  • 打赏
  • 举报
回复
yxz_lp 2008-01-05
下面是需要注意的显式链接的两个缺点:

如果 DLL 具有 DllMain 入口点函数,则操作系统在调用 LoadLibrary 的线程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。如果 DLL 使用 DllMain 函数为进程的每个线程执行初始化,显式链接会造成问题,因为调用 LoadLibrary(或 AfxLoadLibrary)时存在的线程将不会初始化。

如果 DLL 将静态作用域数据声明为 __declspec(thread),则在显式链接时 DLL 会导致保护错误。用 LoadLibrary 加载 DLL 后,每当代码引用此数据时 DLL 就会导致保护错误。(静态作用域数据既包括全局静态项,也包括局部静态项。)因此,创建 DLL 时应避免使用线程本地存储区,或者应(在用户尝试动态加载时)告诉 DLL 用户潜在的缺陷。
  • 打赏
  • 举报
回复
delphihero 2008-01-05
没有。估计是资源释放问题。load 马上 free 之后load 任何dll都会失败。奇怪啊,也没看到内存泄漏
  • 打赏
  • 举报
回复
oldmanzhao 2008-01-05
在DLLMain Attach的时候有没有做什么操作?
  • 打赏
  • 举报
回复
delphihero 2008-01-05
自己写的dll. 对他FreeLibrary。似乎没有释放掉一些资源。Free 之后Load任何 dll 都会失败。奇怪的问题啊。
  • 打赏
  • 举报
回复
系统dll还是别人的dll
  • 打赏
  • 举报
回复
发帖
进程/线程/DLL
加入

1.5w+

社区成员

VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
申请成为版主
帖子事件
创建了帖子
2008-01-05 02:03
社区公告
暂无公告