我正在为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);
}
答案 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);