You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++调用WMI查询Win32_OperatingSystem表返回异常值求助

问题原因排查

1. 操作系统名称输出为内存地址的问题

你直接用std::cout输出vtProp.bstrVal属于类型不匹配:bstrVal是BSTR类型,本质是宽字符(wchar_t*)指针,std::cout默认不会解析宽字符串内容,只会输出指针本身的内存地址,就是你看到的0x9a2fec这类值。
修复方案二选一:

  • 改用宽字符输出流std::wcout打印宽字符串
  • 用_bstr_t类对宽字符串做类型转换,转成窄字符串再用cout输出
    另外还要增加对VARIANT类型的校验,避免Get调用失败后访问空指针:
VARIANT vtProp;
VariantInit(&vtProp); // 先初始化VARIANT
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR) {
    // 方案1:用wcout输出
    std::wcout << L" OS Name : " << vtProp.bstrVal << std::endl;
    // 方案2:转成窄字符输出
    // std::cout << " OS Name : " << (const char*)_bstr_t(vtProp.bstrVal) << std::endl;
} else {
    std::cout << "Failed to get valid Name property" << std::endl;
}
VariantClear(&vtProp);

2. MaxNumberOfProcesses返回-1的问题

这个属于正常现象,Windows系统默认没有设置进程数量的硬上限,Win32_OperatingSystem类的MaxNumberOfProcesses属性固定返回-1代表无限制,不是代码错误。

3. 潜在的异常捕获错误

你代码中throw的是字符串字面量(const char*类型),但是catch的是const std::string&类型,二者不匹配,抛出异常后不会被你写的catch块捕获,会直接触发程序崩溃。修复可以把catch改成捕获const char*,或者throw的时候构造std::string对象。


内容的提问来源于stack exchange,提问作者RUBILAX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:45:03