coinitialize和coinitializeex有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了coinitialize和coinitializeex有什么区别?相关的知识,希望对你有一定的参考价值。
coinitialize(Null);
{
_In_opt_ LPVOID pvReserved, //parameters
_In_ DWORD dwCoIn
Coinitializeex(Null);
{
_In_opt_ LPVOID pvReserved,
_In_ DWORD dwCoInit
}
你能简单解释一下吗?
答案
调用
CoInitialize(NULL);
相当于打电话
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
因此,如果您的应用程序首先调用CoInitialize(NULL)
以及稍后(在同一个线程中)CoInitializeEx(NULL, COINIT_MULTITHREADED)
,这将相当于
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoInitializeEx(NULL, COINIT_MULTITHREADED);
通常,COM库仅在线程上初始化一次。在同一线程上对CoInitialize或CoInitializeEx的后续调用将成功,只要它们不尝试更改并发模型,但将返回S_FALSE。
在您的情况下,您正在尝试更改并发模型,因此调用将失败。
如果在调用CoInitializeEx()
之前没有使用COM,并且你无法删除之前对CoInitialize()
的调用,那么你可以尝试在两者之间调用CoUninitialize()
。
另请注意,COM初始化是每个线程,因此可能使用不同的线程可能有另一种解决方法。
如果您可以更改对CoInitialize()
的调用,只需将其替换为
CoInitializeEx(NULL, COINIT_MULTITHREADED);
以上是关于coinitialize和coinitializeex有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
OTL TOmniBlockingCollection(COM 多线程)中的 CoInitialize/CoUninitialize 错误处理
CoInitialize() 是不是总是在每个 .Net Framework / .Net Core 线程上隐式调用?