无论如何要在初始化列表之前调用 CoInitialize() 吗?

Nic*_*sui 2 c++ com constructor initialization-list

这是我的 ThorDetectorSwitch.cpp 文件构造函数的 C++ 代码:

ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__uuidof(MCLControlClass))
{
    _A  = WstringToBSTR(L"A"); 
    _B  = WstringToBSTR(L"B");
    _C  = WstringToBSTR(L"C");
    _D  = WstringToBSTR(L"D");

    _deviceDetected = FALSE;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,初始化列表_mcSwitch(__uuidof(MCLControlClass))用于初始化 COM 对象(MCLControlClass,从 COM dll 注册)。

我想知道我是否可以在此初始化列表之前调用 CoInitialize() ?因为我收到“CoInitialize() 尚未被调用”的异常。或者有其他方法可以避免这种异常吗?

多谢。

Cap*_*ous 5

首先我建议您使用CoInitializeEx而不是CoInitialize. 甚至 MSDN 文档也推荐这样做。其次,我建议您在每个需要使用 COM 对象的附加线程的开始处CoInitializeEx进行调用。main()这是有充分理由的。例如,在线程结束之前,每个调用都CoInitializeEx应该有一个相应的调用。CoUninitialize这可确保 COM 库正确终止。如果从构造函数调用它,您还必须管理 COM 库的初始化次数,以便进行正确的调用次数CoUninitialize。另一个问题是,当后续调用CoInitializeEx不同的公寓型号时,它将失败。如果发生这种情况,并且您的构造函数正在检查错误,那么您应该在实例化过程中遇到失败情况。如何处理构造函数中的错误情况?抛出异常——这并不是一件令人愉快的事情。

我的最后建议是阅读文档并以正确的方式做事,否则你最终会像过去几天一样摸不着头脑。