3

C++ を使用して WMI クラスから配列データを取得する際に問題に直面しています。

次のリンクhttp://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspxの例のステップ 7 は、実行された wmi クエリの文字列値を取得する方法を示しています。 . ただし、クエリから返された値が uint16 配列である場合、現在問題に直面しています。

例えば。
クエリ: 「Win32_SystemEnclosure から ChassisTypes を選択」


結果:
_ GENUS : 2
_CLASS : Win32_SystemEnclosure
_ SUPERCLASS:
_DYNASTY:
_ RELPATH:
_PROPERTY_COUNT: 1
_派生: {}
_SERVER:
_名前空間:
_PATH:
ChassisTypes: {3}

この場合、結果を実際に処理して、配列から ChassisType の整数値を取得するにはどうすればよいですか? ありがとうございました!

4

1 に答える 1

5

WMI プロパティから配列値にアクセスするにはSafeArrayGetElementSafeArrayGetLBoundおよび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;
}
于 2014-03-20T17:59:22.037 に答える