gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:58:39 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com