为什么在OleUninitialize()之前调用CoFreeUnusedLibraries()?

时间:2010-10-01 07:27:05

标签: windows visual-c++ winapi com

在尝试解决process hanging on CoUninitialize()时,我遇到了许多项目共享的代码。当程序要退出时,首先调用CoFreeUnusedLibraries(),然后立即调用OleUninitialize()

虽然OleUninitialize()的效果很明显,但我无法找到为什么要在致电CoFreeUnusedLibraries()之前致电OleUnitialize()。在这个特定点可能会使用这个电话?

2 个答案:

答案 0 :(得分:2)

CoFreeUnusedLibraries()将为导出此函数的每个进程内COM DLL触发对DllCanUnloadNow的调用。不确定与此API相关的线程问题或进程外COM组件。

据推测,在OleUnitialize之前编写调用DllCanUnloadNow的代码的人试图减少工作集并确保清理。

我不认为在应用程序关闭之前调用CoFreeUnusedLibraries有很多价值(无论如何都会卸载DLL)。

我的经验是,调用CoFreeUnusedLibraries导致崩溃并挂起第三方COM DLL,它们在发布之前从未对其DllCallUnloadNow实现进行过测试。 (因为没有太多的应用程序调用此函数)。

您没有提供调用堆栈或提示挂起发生的位置(您是否闯入调试器以查看堆栈顶部的DLL?)。我的猜测是,如果你无法修复有问题的DLL,你很可能会接听这个电话。

答案 1 :(得分:0)

Docs表示

  

提供此功能   兼容16位Windows。

嗯...

你见过this problem report吗?这个调用对我来说似乎是多余的 - 也许这会使一个或多个DLL处于OleUninitialize无法正常工作的状态 - 等待由于之前调用而导致的某些状态更改。然而,这确实暗示需要在两次通话之间等待......

  

CoFreeUnusedLibraries没有   立即发布没有的DLL   活动对象。有十分钟   延迟多线程公寓   (MTA)和中立公寓(NAs)。   对于单线程公寓(STA),   没有延迟。十分钟   CoFreeUnusedLibraries的延迟是   避免多线程竞争条件   由卸载组件DLL引起的。

其他地方也有评论6 -minute closedown timeout when using DCOM - 这适用于你吗?