coinitialize 和 coinitializeex 有什么区别?

Pan*_*nna -1 c++ com winapi

coinitialize(Null);
    {
        _In_opt_ LPVOID pvReserved, //parameters
        _In_     DWORD  dwCoIn
Coinitializeex(Null);
    {
       _In_opt_ LPVOID pvReserved,
       _In_     DWORD  dwCoInit
    }
Run Code Online (Sandbox Code Playgroud)

你能简单解释一下吗?

Kar*_*oop 7

打电话

CoInitialize(NULL);
Run Code Online (Sandbox Code Playgroud)

相当于调用

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
Run Code Online (Sandbox Code Playgroud)

因此,如果您的应用程序首先调用CoInitialize(NULL)然后稍后(在同一线程中)CoInitializeEx(NULL, COINIT_MULTITHREADED),这将等效于

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoInitializeEx(NULL, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)

文件指出

通常,COM 库仅在线程上初始化一次。在同一线程上对 CoInitialize 或 CoInitializeEx 的后续调用将成功,只要它们不尝试更改并发模型,但将返回 S_FALSE。

在您的情况下,您正在尝试更改并发模型,因此调用将失败。

如果在调用 之前未使用 COM CoInitializeEx(),并且您无法删除之前对 的调用CoInitialize(),则可以尝试CoUninitialize()在两者之间调用。

另请注意,COM 初始化是针对每个线程进行的,因此也许可以使用不同的线程进行另一种解决方法。

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

CoInitializeEx(NULL, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)