对CoInitialize()的双重调用

时间:2011-10-19 16:06:52

标签: winapi com

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

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

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

2 个答案:

答案 0 :(得分:6)

如果CoInitialize已在调用线程中初始化,则

S_FALSE将返回S_OK。但是,对于返回S_FALSECoUninitialize的调用,都需要进行CoUninitialize调用。对此函数的调用次数进行计算,并且仅当CoInitialize的数量等于{{1}}的次数时,它才会实际上取消初始化。

总而言之,第二次调用是无害的,并且调用这对函数不会有多次出现问题。

答案 1 :(得分:2)

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

当然,如果不同意公寓类型,这可能会出错。这是它无法保证的,STA是通常的选择,需要泵送消息循环。该组件不会这样做,这是主持人的工作。如果公寓类型不匹配,那么它需要编组接口指针。当它依赖于它的公寓类型时,它不会做什么。