在 main 函数中调用 getMotherboardSerialNumber 可以正常获取主板序列号,但在 Qt3 的表单构造函数中却无法获取到序列号。

程序在执行时输出了 "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服务了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值