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

标签 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;
}

如您所见,初始化列表_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/

相关文章:

c++ - 使用自定义类型索引容器的适当模式

c++ - 四元数基变换

c++ - 难以创建 vulkan 实例

c# - 如何将事件附加到动态对象或 COM 对象

具有重要成员的 C++11 匿名 union

c++ - 客户端/服务器应用程序的自动化测试

c# - P/Invoke & InterOP 中是否有用于编码的匹配类型表?

c++ - C3867 : '_com_error::Description' : non-standard syntax; use '&' to create a pointer to member

c++ - 为什么在 C++ 中,Visual Studio 将我的类构造函数描述为具有 "2+ Overloads"?

c++ - 为什么类的常量数据成员需要在构造函数中初始化?