当CoInitialize返回RPC_E_CHANGED_MODE时,如果我调用CoUninitialize,会发生什么情况?它会导致任何问题?如果我在CoInitialize返回RPC_E_CHANGED_MODE时调用CoUninitialize会发生什么?
回答
当您停止线程上的所有COM活动时,可以安全地调用CoUninitialize
。留下这样的COM活动 - 广义上说,尤其是。留下引用的存根和代理 - 很可能导致未定义的行为和排序异常。
由于CoInitialize
和CoUninitialize
可以安全地多次调用,您的不成功的CoUninitialize
调用可能会根据上下文产生不同的后果。
当你有你的CoUninitialize
调用之前线程2+ CoInitialize
电话,什么也不会立即发生,但你将有问题后更接近线程终止时,上层代码调用它的大概配对CoUninitialize
电话终于结束COM初始化。请注意,在这种情况下,您的CoUninitialize
不允许您更改单元模式,因为您的调用不会终止线程上的COM(当您在线程上完全未初始化COM时,只能更改单元模式)。总之,你应该坚持基本原则:你永远不要自己打电话CoUninitialize
。您可以拨打CoInitialize
,如果成功,则在完成COM后,必须在线程后面致电CoUninitialize
。走出这条道路很可能会让你陷入困境,这对于快速识别和排除故障来说往往是非常痛苦的。
引用[文档](https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v = vs.85).aspx):“要在线程上优雅地关闭COM库, **每次成功调用CoInitialize或CoInitializeEx,包括任何返回S_FALSE的调用,都必须通过相应的CoUninitialize调用进行平衡。“ –
- 1. 调用CoInitialize/CoUnInitialize
- 2. CoInitialize()/ CoUninitialize()调用配对
- 3. 谁负责调用CoInitialize和CoUninitialize如果代理进程或COM +
- 4. 难道我还需要调用CoInitialize(NULL)和CoUninitialize()如果我切换到ATL?
- 5. 如果我在OnTouchListener中返回false,会发生什么?
- 6. C++ - 如果我返回一个* = b;`会发生什么?
- 7. 如果我错过了Facebook的回调,会发生什么?
- 8. 如果我调用GlobalLock()然后调用GlobalUnlock()会发生什么?
- 9. 如果我在main中调用fork(),会发生什么?
- 10. 如果action类在struts中返回null,会发生什么?
- 11. 如果我用空的url调用jQuery.post()会发生什么?
- 12. 如果我在链接时不使用-g,会发生什么
- 13. 如果多次调用GetOrAdd()ValueFactory,额外的返回值会发生什么?
- 14. 返回值(返回对象)忽略时会发生什么?
- 15. 如果我不直接调用willMoveToParentViewController&didMoveToParentViewController,会发生什么?
- 16. 如果我们直接调用run方法会发生什么?
- 17. 如果我从AsyncTask调用一个方法会发生什么?
- 18. 如果我不调用transaction.close或transaction.rollback,会发生什么情况?
- 19. 如果我调用WaitHandle.Dispose(),等待线程会发生什么?
- 20. 如果我自己调用run()方法会发生什么?
- 21. 当我从SQL游标中返回时会发生什么?
- 22. 如果没有“捕获”,返回值会发生什么?
- 23. 如果发生错误,ParseUser.signUpInBackground()会返回什么?
- 24. 如果函数不返回,执行堆栈会发生什么?
- 25. 如果/当DllImport被多次调用时会发生什么?
- 26. 我调用MPI_Init()后会发生什么?
- 27. 如果我在Observable的Subscribe回调中抛出异常,会发生什么?
- 28. 返回ActionResult后会发生什么?
- 29. IRouteConstraint.Match返回false后会发生什么
- 30. 调用setCancelsTouchesInView时会发生什么?
你试过了吗? – Mifeet
您进行的每个COM调用都将失败,并显示CO_E_NOINITIALIZED。由于您使用不适当的CoUnitialize()调用未初始化COM。是的,这是一个问题。 –