程序在执行时输出了 "Failed to initialize COM library."。这表明 CoInitializeEx 调用失败,并且错误码不是 RPC_E_CHANGED_MODE。以下是对问题的详细分析和解决方法。
1.使用与 Qt 兼容的线程模型
如果 Qt 的 GUI 线程已经初始化了 COM 库为 STA 模型,您可以改为使用 COINIT_APARTMENTTHREADED 来初始化 COM 库:
BOOL comInitialized = SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED));
if (!comInitialized) {
DWORD errorCode = GetLastError();
if (errorCode != RPC_E_CHANGED_MODE) {
std::cerr << "Failed to initialize COM library. Error code: " << errorCode << std::endl;
return "Failed to initialize COM library.";
}
}
2. 安全上下文的设置问题
在 Qt3 的 GUI 环境中,安全上下文的设置可能会受到限制。例如:
CoInitializeSecurity的调用可能失败,因为 Qt3 的主线程已经设置了不同的安全级别。- 如果安全上下文设置不正确,后续的 WMI 查询可能会失败。
解决方法
可以尝试跳过 CoInitializeSecurity 的调用,尤其是在 Qt3 环境中,GUI 线程可能已经设置了适当的安全上下文。您可以注释掉 CoInitializeSecurity 的部分代码,直接尝试连接 WMI 服务。
// 初始化安全级别,这些代码在qt3中可以删除
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres)) {
std::cerr << "Failed to initialize security." << std::endl;
if (comInitialized) {
CoUninitialize();
}
return "Failed to initialize security.";
}
接下来的代码就是直接连接WMI服务了

被折叠的 条评论
为什么被折叠?



