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
相关产品推荐
相关产品推荐

