当CoInitialize返回RPC_E_CHANGED_MODE时,如果我调用CoUninitialize会发生什么?它会引起任何问题吗?
答案 0 :(得分:1)
当您停止线程上的所有COM活动时,可以安全地调用CoUninitialize
。离开这种COM活动 - 从广义上讲,尤其是留下引用的存根和代理 - 很可能导致未定义的行为和排序异常。
由于可以安全地多次调用CoInitialize
和CoUninitialize
,因此根据上下文,您的未配对CoUninitialize
调用可能会产生不同的后果。
当你在CoInitialize
调用之前在线程上进行了2次以上CoUninitialize
调用时,不会立即发生任何事情,但是当上级代码调用它时,你将在以后更接近线程终止时遇到问题配对CoUninitialize
调用并最终终止COM初始化。请注意,此方案中的CoUninitialize
不允许您更改公寓模式,因为您的调用不会终止线程上的COM(当您在线程上完全未初始化COM时,您只能更改公寓模式)。
总而言之,你应该坚持基本规则:你永远不会自己打电话给CoUninitialize
。您调用CoInitialize
,如果成功,则必须在完成COM后稍后在线程上调用CoUninitialize
。撇开这条路可能会让你陷入困境,这通常很难以快速识别和排除故障。