如果我在CoInitialize返回RPC_E_CHANGED_MODE时调用CoUninitialize会发生什么?

时间:2014-05-10 13:35:48

标签: com

当CoInitialize返回RPC_E_CHANGED_MODE时,如果我调用CoUninitialize会发生什么?它会引起任何问题吗?

1 个答案:

答案 0 :(得分:1)

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

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

当你在CoInitialize调用之前在线程上进行了2次以上CoUninitialize调用时,不会立即发生任何事情,但是当上级代码调用它时,你将在以后更接近线程终止时遇到问题配对CoUninitialize调用并最终终止COM初始化。请注意,此方案中的CoUninitialize不允许您更改公寓模式,因为您的调用不会终止线程上的COM(当您在线程上完全未初始化COM时,您只能更改公寓模式)。

总而言之,你应该坚持基本规则:你永远不会自己打电话给CoUninitialize。您调用CoInitialize,如果成功,则必须在完成COM后稍后在线程上调用CoUninitialize。撇开这条路可能会让你陷入困境,这通常很难以快速识别和排除故障。