【问题标题】:COM DLL was unloaded with lock counter is still non-zeroCOM DLL 被卸载,锁计数器仍然非零
【发布时间】:2012-01-24 01:56:34
【问题描述】:

我的程序由 VSTS VSinstr 工具检测,以收集覆盖率信息。但是在运行我的检测二进制文件时,特别是我的一个 COM dll,我的程序一直在退出点崩溃。

我调试发现崩溃的原因是:

  • 首先,我使用 coLoadLibrary( bAutoFree = TRUE ) 加载我的 COM dll。
  • 我的程序做了一些工作。
  • 来到出口点。
  • 然后,我的 COM dll 被卸载。 WINDBG 表示它的 DllMain 是用 dwReason == DLL_PROCESS_DETACH 调用的。
  • 我的 COM dll 中的代码被执行并引发访问冲突(代码 c0000005)。让我疑惑的是,此时_AtlModule.m_nLockCnt的值还是等于2!

有什么想法吗?

【问题讨论】:

  • 你为什么调用 CoLoadLibrary 而不是 CoCreateInstance?你打电话给 CoFreeLibrary 吗?

标签: dll com atl


【解决方案1】:

为了查询卸载通过COM API加载的DLL是否安全,调用DLL的DllCanUnloadNow。您可以在此处设置断点并检查您的 COM DLL 是否批准卸载(同时仍可能忙于一些后台活动)。

【讨论】:

  • 我认为这只是因为在进程即将终止时应该卸载dll,即使它的锁计数器不等于0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2021-08-31
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多