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