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);

documentation

通常,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 线程上隐式调用?

Qt-不调用CoInitialize-实现SDL多线程运行

Qt-不调用CoInitialize-实现SDL多线程运行

多线程下使用使用 UniDAC+MSSQL 需要注意的问题(使用CoInitialize)

多线程调用COM组件的体会(CoInitialize)(转)