【发布时间】: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