【问题标题】:What would happen if I call CoUninitialize when the CoInitialize return RPC_E_CHANGED_MODE?如果我在 CoInitialize 返回 RPC_E_CHANGED_MODE 时调用 CoUninitialize 会发生什么?
【发布时间】:2014-05-10 21:46:24
【问题描述】:

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

【问题讨论】:

  • 您进行的每个 COM 调用都将失败并显示 CO_E_NOINITIALIZED。由于您使用不适当的 CoUnitialize() 调用未初始化 COM。是的,这是个问题。

标签: com


【解决方案1】:

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

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

当您在调用 CoUninitialize 之前对线程进行了 2 次以上的 CoInitialize 调用时,不会立即发生任何事情,但是当上层代码调用其可能配对的 CoUninitialize 时,您将在稍后接近线程终止时遇到问题调用并最终终止 COM 初始化。请注意,在这种情况下,您的 CoUninitialize 不允许您更改单元模式,因为您的调用不会终止线程上的 COM(只有在线程上完全未初始化 COM 时才能更改单元模式)。

总而言之,您应该遵守基本规则:您永远不要单独调用CoUninitialize。您调用CoInitialize,如果成功,您必须稍后在完成COM 时在线程上调用CoUninitialize。离开这条路很可能会给您带来麻烦,而这通常太痛苦而无法快速识别和排除故障。

【讨论】:

  • 引用documentation:“要在线程上优雅地关闭 COM 库,每次成功调用 CoInitialize 或 CoInitializeEx,包括任何返回 S_FALSE 的调用,都必须平衡通过对 CoUninitialize 的相应调用。”
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 2015-07-13
  • 2011-04-11
  • 2019-10-07
  • 2018-04-17
  • 2023-04-05
  • 2014-03-01
  • 2011-03-15
相关资源
最近更新 更多