【问题标题】:CoInitialize() / CoUninitialize() calls pairingCoInitialize() / CoUninitialize() 调用配对
【发布时间】:2010-01-28 19:50:02
【问题描述】:

我有一个使用 COM 对象的单线程应用程序。一开始我实际上两次调用CoInitialize(0) - 一次在我的代码中,第二次在应用程序的另一个子系统的代码中。第一个调用返回S_OK,第二个返回S_FALSE——正如MSDN 所说。

当应用程序停止时,它会调用CoUninitialize() 两次,但在这些调用之间,它会尝试调用某些 COM 对象的方法——这些调用会因访问冲突而崩溃,因为我认为 COM 对象在第一次调用 @ 时已完成并释放987654326@。如果我删除对CoInitialize()/CoUnitialize() 的重复调用,它就可以正常工作。

但这是为什么呢? MSDN 说我可以反复拨打CoInitialize(),并且只能将这些呼叫与匹配号码的CoUnitialize() 呼叫配对。

为什么 COM 对象在第一次调用 CoUninitialize() 时就完成了。

【问题讨论】:

  • 出于好奇,为什么您希望按照您实现的方式工作 - 为什么不只是一对?
  • 其他子系统有时会被其他程序使用,要求它们调用 CoInitialize() 是很丑陋的,因此子系统会在创建它将使用的第一个 COM 对象之前自行调用它。
  • 我不能说为什么它不起作用,但我看到了类似的问题并且总是回到只有一个 CoUninitialize - 毫无疑问你已经考虑(作为一种解决方法)跟踪 CoInitialize 返回 S_FALSE 而不调用 CoUnitialize。
  • 根据我的经验,单个组件自己初始化 COM 是不明智的,特别是因为您遇到了这样的问题。强制客户端初始化 COM 是更好的设计。
  • 我查看了 XP SP3,CoUninitialize 是引用计数的,除了调用 NotifyInitializeSpies(我的机器上的空列表)之外,它只会在第一次调用时减少引用计数。在 _CoUninitialize@0 上设置一个断点,以验证其他一些没有调用它额外的时间。我假设你没有在 CoInit() 返回 S_FALSE 之后立即调用它。

标签: windows visual-c++ com com-interop


【解决方案1】:

听起来您的操作是正确的,但是,请检查以确保您的 couninitialize 调用在应用程序的主窗口关闭后以及该窗口的消息循环运行完成后完成。

【讨论】:

  • 你能把它移到循环之外吗?这可能会有所帮助。
  • 其实这并不容易。为什么它首先很重要?
  • 这很重要,因为我找到了一些说明这样做的文档(一个较旧的帮助文件)。不确定它是否会解决问题。不过有点道理。
  • @Don Dickinson:我完全不明白为什么这与问题有关。
  • 它只是相关的,因为我在上面阅读的帮助文件(delphi 附带的较旧的帮助文件)对此非常具体。它说在消息循环完成后调用 counitialize。
猜你喜欢
  • 2013-10-26
  • 2018-04-17
  • 2015-07-13
  • 1970-01-01
  • 2011-04-11
  • 2021-10-30
  • 1970-01-01
  • 2018-06-25
  • 2014-12-31
相关资源
最近更新 更多