2014-05-10 24 views

回答

1

当您停止线程上的所有COM活动时,可以安全地调用CoUninitialize。留下这样的COM活动 - 广义上说,尤其是。留下引用的存根和代理 - 很可能导致未定义的行为和排序异常。

由于CoInitializeCoUninitialize可以安全地多次调用,您的不成功的CoUninitialize调用可能会根据上下文产生不同的后果。

当你有你的CoUninitialize调用之前线程2+ CoInitialize电话,什么也不会立即发生,但你将有问题后更接近线程终止时,上层代码调用它的大概配对CoUninitialize电话终于结束COM初始化。请注意,在这种情况下,您的CoUninitialize不允许您更改单元模式,因为您的调用不会终止线程上的COM(当您在线程上完全未初始化COM时,只能更改单元模式)。总之,你应该坚持基本原则:你永远不要自己打电话CoUninitialize。您可以拨打CoInitialize,如果成功,则在完成COM后,必须在线程后面致电CoUninitialize。走出这条道路很可能会让你陷入困境,这对于快速识别和排除故障来说往往是非常痛苦的。

+0

引用[文档](https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v = vs.85).aspx):“要在线程上优雅地关闭COM库, **每次成功调用CoInitialize或CoInitializeEx,包括任何返回S_FALSE的调用,都必须通过相应的CoUninitialize调用进行平衡。“ –

相关问题