这是我的 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对象(MCLControlClass,从COM dll注册)。
我想知道我是否可以在此初始化列表之前调用 CoInitialize() ?因为我收到“CoInitialize() 尚未被调用”的异常。或者有其他方法可以避免这种异常吗?
非常感谢。
最佳答案
首先我建议您使用CoInitializeEx
而不是CoInitialize
。甚至 MSDN 文档也推荐这样做。其次,我建议您在 main()
中以及在每个需要使用 COM 对象的附加线程开始时调用 CoInitializeEx
。这是有充分理由的。例如,每次调用 CoInitializeEx
都应该有一个相应的调用 CoUninitialize
在线程结束之前。这可确保 COM 库正确终止。如果从构造函数调用它,您还必须管理 COM 库的初始化次数,以便对 CoUninitialize
进行正确的调用次数。另一个问题是,当使用不同的公寓模型对 CoInitializeEx 进行后续调用时,它将失败。如果发生这种情况,并且您的构造函数正在检查类似的错误,那么您应该在实例化过程中遇到失败情况。如何处理构造函数中的错误情况?抛出异常——这并不是一件令人愉快的事情。
我的最终建议是阅读文档并以正确的方式做事,否则你最终会像过去几天一样摸不着头脑。
关于c++ - 无论如何要在初始化列表之前调用 CoInitialize() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100263/