Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 对CoInitialize()的双重调用_Winapi_Com - Fatal编程技术网

Winapi 对CoInitialize()的双重调用

Winapi 对CoInitialize()的双重调用,winapi,com,Winapi,Com,假设我的应用程序在启动时调用CoInitialize,在它存在之前调用ConInitialize 假设我有一个第三方组件,它被我的应用程序使用并执行类似的操作,这会导致某种故障吗 在已提交调用时调用CoInitialize可以吗?第二次呼叫会失败吗?或者它只是像已经调用的那样“让它通过”。如果它已经在调用线程中初始化,则将返回s\u FALSE。但是,对于返回S_OK和S_FALSE的两个调用,都需要调用coninitialize。对该函数的调用数被计数,并且只有当coninitialize的数

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

假设我有一个第三方组件,它被我的应用程序使用并执行类似的操作,这会导致某种故障吗


在已提交调用时调用CoInitialize可以吗?第二次呼叫会失败吗?或者它只是像已经调用的那样“让它通过”。如果它已经在调用线程中初始化,则将返回
s\u FALSE
。但是,对于返回
S_OK
S_FALSE
的两个调用,都需要调用
coninitialize
。对该函数的调用数被计数,并且只有当
coninitialize
的数量等于
CoInitialize
的数量时,它才会实际取消初始化


因此,总之,第二次调用是无害的,多次调用这对函数没有问题。

这从根本上说是错误的,拥有线程的代码必须调用CoInitialize()。如果它的行为类似于进程内服务器,并且不启动自己的线程,那么它永远不是第三方组件


当然,当它对公寓类型不一致时,这可能也会出错。这是它无法保证的,STA是通常的选择,需要泵送一个消息循环。组件不会这样做,这是主机的工作。如果单元类型不匹配,则需要封送接口指针。如果这两个电话是兼容的,那么它就不会选择公寓类型。

。如果两个调用不兼容(例如,第一个调用在STA模式下初始化,第二个调用在MTA模式下初始化),则您将收到错误
RPC\u e\u CHANGED\u模式
。这些都在文档中详细说明了。一些应用程序将检查协同初始化的结果,如果返回S_FALSE,则将“不继续”。您建议忽略它(对于第二次调用?)@Ron M:为什么在成功调用
CoInitialize
后应用程序不继续?注意
S\u FALSE
中的
S
表示成功。对不起,我今天早上没有喝足够的咖啡因。当然,S_FALSE包含在成功的(结果)评估中……事实上,我对所描述的逻辑有严重的问题——有道理。如果第三方组件需要访问COM对象,并且不能保证调用线程已经在组件外部调用了
CoInitialize()
,那么调用
CoInitialize()
是完全可以的。如果组件在调用线程中第一次调用
CoInitialize()
,请务必小心,因为这将在线程的剩余生命周期内建立线程模型,如果线程稍后决定使用不同的线程模型,这可能会导致问题。可能会重复