coinitialize和coinitializeex之间的差异是什么?

时间:2018-03-06 06:27:13

标签: c++ winapi com

coinitialize(Null);
    {
        _In_opt_ LPVOID pvReserved, //parameters
        _In_     DWORD  dwCoIn
Coinitializeex(Null);
    {
       _In_opt_ LPVOID pvReserved,
       _In_     DWORD  dwCoInit
    }

你能简单解释一下吗?

1 个答案:

答案 0 :(得分:3)

致电

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()。< / p>

另请注意,每个线程都有COM初始化,因此使用不同的线程可能会有另一种解决方法。

如果您可以将通话更改为CoInitialize(),只需将其替换为

即可
CoInitializeEx(NULL, COINIT_MULTITHREADED);