对CoInitialize()的双重调用

Jas*_*enX 5 com winapi

假设我的应用程序在启动时调用CoInitialize,在它存在之前调用CoUninitialize.

假设我有一个第三方组件,我的应用程序使用并做类似的事情,这会导致某种失败吗?

可以在提交呼叫时调用CoInitialize吗?第二次通话会失败吗?或者它只是"让它通过",因为它已被调用.

K-b*_*llo 6

CoInitializeS_FALSE如果它已在调用线程中初始化,则返回.然而,对于同时返回调用S_OK,并S_FALSE需要有一个CoUninitialize电话.对此函数的调用次数进行计数,并且仅当与其CoUninitialize相等的次数CoInitialize实际上未初始化时才计算.

总而言之,第二次调用是无害的,并且不止一次调用这对函数也没有问题.

  • 只要两个呼叫兼容.如果两个调用不兼容(例如,第一个调用在STA模式下初始化,第二个调用在MTA模式下初始化),那么您将收到错误"RPC_E_CHANGED_MODE".这些都在文档中详细说明.http://msdn.microsoft.com/library/ms678543.aspx (5认同)
  • @Ron M:为什么应用程序在成功调用“CoInitialize”后不会继续?注意“S_FALSE”中的“S”表示成功。 (2认同)

Han*_*ant 5

从根本上说,这是完全错误的,必须由拥有线程的代码调用CoInitialize()。如果它像进程内服务器一样运行并且不启动自己的线程,则它永远不是第三方的组件。

当然,如果不同意公寓类型,这可能并会出错。这是不能保证的,通常是选择STA,这需要注入消息循环。该组件不会执行此操作,这是主机的工作。如果单元类型不匹配,则需要封送接口指针。依靠选择的公寓类型时,它不会执行此操作。

  • 如果第三方组件需要访问COM对象并且不能保证调用线程已经在组件外部调用了CoInitialize(),那么第三方组件调用CoInitialize()是完全可以的。请小心,如果该组件是在调用线程中首次调用`CoInitialize()`,因为这将在线程的整个生命周期中建立线程模型,如果线程稍后再根据需要决定,则可能会导致问题。使用不同的线程模型。 (4认同)