VARIANTとSAFEARRAYのメモ

  ////////////////////////////////////////////////////////////////////////////////
  // VARIANT の BSTR を確認して TCHAR* lptcValue に返す
  // 成功なら「true」を返す
  // 渡し値:IWbemClassObject* pWbmObject Wbmのオブジェクト
  //         WCHAR* lpwcName   確認するオブジェクトのステータス
  //         TCHAR* lptcValue  結果の格納
  //         int iStrLen       文字数
  ////////////////////////////////////////////////////////////////////////////////
  bool CWmiLib::GetStringValue( IWbemClassObject* pWbmObject, WCHAR* lpwcName, LPSTR lpsValue, int iStrLen )
  {
    HRESULT hr;
    VARIANT var;
    int iLen;

    // VARIANTの初期化
    VariantInit( &var );

    if( FAILED( hr = pWbmObject->Get( lpwcName, 0, &var, NULL, NULL) ) )
    {
      return false;
    }

    if(!CheckValue(var, VT_BSTR))
    {
      return false;
    }

  #ifdef _UNICODE
    if(!CheckValue(var, VT_ARRAY))
    {
      WideCharToMultiByte(CP_ACP , 0 , var.bstrVal, -1 , lpsValue , MAX_PATH, NULL , NULL);
    }
    else
    {
      SAFEARRAY *psa = var.parray;
      BSTR* cArray;
      LONG cElements, lLBound, lUBound;
      char cBuff[WBEM_MAX_PATH] = "";

      // 配列の数
      if (SafeArrayGetDim(psa) != 1)
      {
        return false;
      }

      // Get array bounds.
      hr = SafeArrayGetLBound(psa, 1, &lLBound);
      if (FAILED(hr))
      {
        return false;
      }

      hr = SafeArrayGetUBound(psa, 1, &lUBound);
      if (FAILED(hr))
      {
        return false;
      }

      hr = SafeArrayAccessData(psa, (void**)&cArray);
      if (FAILED(hr))
      {
        return false;
      }

      cElements = lUBound - lLBound + 1;

      ZeroMemory(cBuff, sizeof(cBuff));
      for (int i = 0; i < cElements; i++)
      {
        _bstr_t bx = cArray[i];
        lstrcat((LPWSTR)cBuff,bx); // _bstr_t のASCII自動変換
        if(i < (cElements - 1))
        {
          _bstr_t _bx = "\r\n";
          lstrcat((LPWSTR)cBuff, _bx);
        }
      }
      WideCharToMultiByte(CP_ACP , 0 , (LPCWSTR)cBuff, -1 , lpsValue , WBEM_MAX_PATH, NULL , NULL);
      SafeArrayUnaccessData(var.parray);

    }
  #else
    WideCharToMultiByte(CP_ACP , 0 , var.bstrVal, -1 , lpsValue , MAX_PATH, NULL , NULL);
  #endif
    iLen = strlen(lpsValue);
    lpsValue[iLen + 1] = TEXT('\0');
    VariantClear( &var );

    return true;
  }