这是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;
}

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

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

非常感谢。

最佳答案

首先,我建议您使用 CoInitializeEx 而不是CoInitialize。甚至MSDN文档也建议这样做。其次,我建议您在CoInitializeEx中以及每个需要使用COM对象的附加线程的开头调用main()。这有很好的理由。例如,在线程结束之前,每个对CoInitializeEx的调用都应该对 CoUninitialize 进行相应的调用。这样可以确保COM库正确终止。如果从构造函数中调用它,则还必须管理COM库初始化的次数,以便正确调用CoUninitialize。另一个问题是,当随后使用其他单元模型对CoInitializeEx进行调用时,它将失败。如果发生这种情况,而您的构造函数正在检查错误,则应该在实例化过程中遇到故障。您如何处理构造函数中的错误情况?通过抛出异常-发生一件非常不愉快的事情。

我的最终建议是阅读文档,并以正确的方式进行操作,否则最终会像最近几天一样挠头。

关于c++ - 无论如何在初始化列表之前调用CoInitialize()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17100263/

10-11 22:57
查看更多