WMI返回类型转换

时间:2013-12-28 13:45:21

标签: c++ wmi

我正在为Open Hardware Monitor制作一个插件。但我使用Windows wmi数据库时遇到问题。我可以运行一个查询,然后从中获取一个值。但是我无法将值转换为正确的类型。因为我在运行时创建了一个查询,所以我不知道WMI数据库必须返回哪种类型才能运行而没有错误。在我的情况下,我可以得到一个浮点数或字符串。但是当我从数据库中获取一个浮点数并将其转换为字符串时,我遇到了内存错误。如果我将一个字符串转换为浮点数,我不会得到任何错误。现在我如何创建一个检查BSTR值是否无效?或者我该如何检查我必须使用哪种类型?我用一些if语句或try catch测试了它。但他们没有工作。

try
{
    wstring ws(vtProp.bstrVal, SysStringLen(vtProp.bstrVal));
    returnValue = string(ws.begin(), ws.end());
    ws.clear();
}
catch (...)
{
    float temp = vtProp.fltVal;
    returnValue = to_string(temp);
}

1 个答案:

答案 0 :(得分:1)

您可以使用type of the WMI property方法检索IWbemClassObject::Get。然后使用 VARIANT 变量的正确字段来访问该值。

试试这个样本

VARIANT vtProp;
CIMTYPE pType;

//here put the real property Name
hr = pclsObj->Get(L"PropertyName", 0, &vtProp, &pType, 0);
if (!FAILED(hr))
{
 //check if the property is a string 
 if (pType == CIM_STRING && pType != CIM_EMPTY && pType!= CIM_ILLEGAL)
 {
      wcout << "Value : " << vtProp.bstrVal << endl;
 }
 else
 //check if the property is a float
 if (pType == CIM_REAL32 && pType != CIM_EMPTY && pType!= CIM_ILLEGAL)
 {
      wcout << "Value : " << vtProp.fltVal << endl;
 }

}
VariantClear(&vtProp);