我的代码在一个线程上调用CoInitializeEx(NULL, COINIT_MULTITHREADED)
,然后在同一个线程上调用CoInitialize(NULL)
。
我知道CoInitialize(NULL)
调用将失败RPC_E_CHANGED_MODE
,但这不是我关注的问题。代码正确处理此错误如下: -
if (retValue == RPC_E_CHANGED_MODE) {
thModel = kThModelMulti; // thread was initialized with MTA model
}
请不要担心功能方面。
调用CoInitialize(NULL)
是否存在任何性能问题 - 这会非常昂贵吗?如果是这样,我将更改代码以确定如果CoInitialize(NULL)
已被调用,则甚至不会致电CoInitializeEx
。
答案 0 :(得分:1)
调用CoInitialize(NULL)
与调用CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)
具有相同的效果。如果您在已调用CoInitialize(NULL)
的线程上调用CoInitializeEx(NULL, COINIT_MULTITHREADED)
,则它将失败,错误代码为RPC_E_CHANGED_MODE
。这在documentation:
设置线程的并发模型后,无法更改。在先前初始化为多线程的公寓上调用 CoInitialize 将失败并返回RPC_E_CHANGED_MODE。
性能影响无关紧要。这是一个功能性问题,也就是bug。