Com 当CoInitialize返回RPC_E_更改了_模式时,如果调用conInitialize,会发生什么情况?

Com 当CoInitialize返回RPC_E_更改了_模式时,如果调用conInitialize,会发生什么情况?,com,Com,当CoInitialize返回RPC_E_更改了_模式时,如果调用conInitialize,会发生什么情况?它会导致任何问题吗?当您停止线程上的所有COM活动时,可以安全地调用conInitialize。离开这样的COM活动——从广义上讲,特别是离开引用的存根和代理——很可能会导致未定义的行为和各种异常 由于可以多次安全地调用CoInitialize和CoUninitialize,因此未配对的CoUninitialize调用可能会产生不同的后果,具体取决于上下文 如果在调用CoUninitia

当CoInitialize返回RPC_E_更改了_模式时,如果调用conInitialize,会发生什么情况?它会导致任何问题吗?

当您停止线程上的所有COM活动时,可以安全地调用
conInitialize
。离开这样的COM活动——从广义上讲,特别是离开引用的存根和代理——很可能会导致未定义的行为和各种异常

由于可以多次安全地调用
CoInitialize
CoUninitialize
,因此未配对的
CoUninitialize
调用可能会产生不同的后果,具体取决于上下文

如果在调用
CoUninitialize
之前,线程上有2个+
CoInitialize
调用,则不会立即发生任何事情,但是,当更高级别的代码调用其可能成对的
CoUninitialize
调用并最终终止COM初始化时,线程终止时,您将遇到问题。请注意,在这种情况下,您的
CoUninitialize
不允许您更改单元模式,因为您的调用不会终止线程上的COM(您只能在完全取消初始化线程上的COM时更改单元模式)


总而言之,您应该坚持基本规则:您永远不会单独调用
coninitialize
。您可以调用
CoInitialize
,如果成功,则必须在完成COM后在线程上调用
CoUninitialize
。离开这条路可能会给您带来麻烦,这通常太痛苦,无法快速识别和排除故障。

您拨打的每一个COM电话都会因未初始化而失败。因为您使用不适当的conInitialize()调用取消了COM的初始化。是的,这是一个问题。引用“要在线程上优雅地关闭COM库,每次成功调用CoInitialize或CoInitializeEx,包括任何返回s_FALSE的调用,都必须通过相应的调用ConInitialize来平衡。”