2011-12-20 52 views
1

我有我的程序由VSTS VSinstr工具检测,以收集覆盖信息。但是,当运行我的仪器化的二进制文件,特别是我的一个COM DLL时,我的程序一直崩溃在出口点。COM DLL被卸载,锁定计数器仍然非零

我调试,找出死机的原因是:

  • 首先,我打开我的coLoadLibrary(bAutoFree = TRUE)COM DLL。
  • 我的程序做了一些工作。
  • 来到退出点。
  • 然后,我的COM DLL被卸载。 WINDBG指示它的DllMain用dwReason == DLL_PROCESS_DETACH调用。
  • 我的COM DLL中的代码被执行并引发访问冲突(代码为c0000005)。让我困惑的是,在这个时候,_AtlModule.m_nLockCnt的值仍然等于2!

任何想法?

+1

你为什么要调用CoLoadLibrary而不是CoCreateInstance?你打电话给CoFreeLibrary吗? – 2011-12-20 01:57:25

回答

0

为了查询卸载通过COM API加载的DLL是否安全,调用DLL的DllCanUnloadNow。这是您可以设置断点并检查您的COM DLL是否批准卸载的位置(虽然仍占用一些后台活动)。

+0

我认为这只是因为应该在进程终止时卸载dll,即使它的锁定计数器不等于0。 – eeelin 2011-12-27 10:35:25