这是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/