Я столкнулся с проблемой при получении данных массива из класса WMI с помощью C ++.
По следующей ссылке http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx, На шаге 7 примера показано, как получить строковое значение выполненного запроса wmi. Однако в настоящее время я сталкиваюсь с проблемой, когда значение, возвращаемое из запроса, представляет собой массив uint16.
например.
Запрос: «Выберите ChassisTypes из Win32_SystemEnclosure»
Результат:
_GENUS: 2
_CLASS: Win32_SystemEnclosure
_суперкласс:
_DYNASTY:
_RELPATH:
_PROPERTY_COUNT: 1
_ПРОИЗВОДСТВО: {}
_SERVER:
_NAMESPACE:
_ДОРОЖКА:
Типы шасси: {3}
Могу ли я спросить, как на самом деле обработать результат для получения целочисленного значения ChassisType из массива в этом случае? Спасибо!
Для доступа к значениям массива из свойства WMI вы можете использовать SafeArrayGetElement
, SafeArrayGetLBound а также SafeArrayGetUBound методы.
Попробуйте этот образец
VARIANT vtProp;
hr = pclsObj->Get(L"ChassisTypes", 0, &vtProp, 0, 0);// Uint16
if (!FAILED(hr))
{
if ((vtProp.vt==VT_NULL) || (vtProp.vt==VT_EMPTY))
wcout << "ChassisTypes : " << ((vtProp.vt==VT_NULL) ? "NULL" : "EMPTY") << endl;
else
if ((vtProp.vt & VT_ARRAY))
{
wcout << "ChassisTypes : " << endl;
long lLower, lUpper;
UINT32 Element = NULL;
SAFEARRAY *pSafeArray = vtProp.parray;
SafeArrayGetLBound(pSafeArray, 1, &lLower);
SafeArrayGetUBound(pSafeArray, 1, &lUpper);
for (long i = lLower; i <= lUpper; i++)
{
hres = SafeArrayGetElement(pSafeArray, &i, &Element);
wcout << Element<< endl;
}
SafeArrayDestroy(pSafeArray);
}
VariantClear(&vtProp);
pclsObj->Release();
pclsObj=NULL;
}
Других решений пока нет …