【发布时间】:2014-05-10 21:46:24
【问题描述】:
如果我在 CoInitialize 返回 RPC_E_CHANGED_MODE 时调用 CoUninitialize 会发生什么?会不会有什么问题?
【问题讨论】:
-
您进行的每个 COM 调用都将失败并显示 CO_E_NOINITIALIZED。由于您使用不适当的 CoUnitialize() 调用未初始化 COM。是的,这是个问题。
标签: com
如果我在 CoInitialize 返回 RPC_E_CHANGED_MODE 时调用 CoUninitialize 会发生什么?会不会有什么问题?
【问题讨论】:
标签: com
当您停止线程上的所有 COM 活动时,调用 CoUninitialize 是安全的。离开这样的 COM 活动——从广义上讲,尤其是。留下引用的存根和代理 - 很可能导致未定义的行为和各种异常。
由于可以安全地多次调用CoInitialize 和CoUninitialize,因此您未配对的CoUninitialize 调用可能会根据上下文产生不同的后果。
当您在调用 CoUninitialize 之前对线程进行了 2 次以上的 CoInitialize 调用时,不会立即发生任何事情,但是当上层代码调用其可能配对的 CoUninitialize 时,您将在稍后接近线程终止时遇到问题调用并最终终止 COM 初始化。请注意,在这种情况下,您的 CoUninitialize 不允许您更改单元模式,因为您的调用不会终止线程上的 COM(只有在线程上完全未初始化 COM 时才能更改单元模式)。
总而言之,您应该遵守基本规则:您永远不要单独调用CoUninitialize。您调用CoInitialize,如果成功,您必须稍后在完成COM 时在线程上调用CoUninitialize。离开这条路很可能会给您带来麻烦,而这通常太痛苦而无法快速识别和排除故障。
【讨论】: