coinitialize 和 coinitializeEx 有什么区别

what is the differnce between coinitialize and coinitializeex?

本文关键字:什么 区别 coinitializeEx coinitialize      更新时间:2023-10-16
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);