C++ を使用したインスタンスの作成と宣言

IWbemServices インターフェイスを使用して C++ でインスタンスを作成できます。

このトピックのコード例を正しくコンパイルするには、次の #include ステートメントが必要です。

#include <wbemidl.h>

次の手順では、既存のクラスのインスタンスを作成する方法について説明します。

既存のクラスのインスタンスを作成するには

  1. IWbemServices::GetObject または IWbemServices::GetObjectAsync メソッドを呼び出して、既存のクラスの定義を取得します。

    次のコード例は、GetObject および GetObjectAsync メソッドを使用して、クラス定義へのアクセスを提供する IWbemClassObject インターフェイスへのポインターを取得する方法を示しています。

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewInstance = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;
    
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                  &pExampleClass, &pResult);
    SysFreeString(PathToClass);
    
  2. IWbemClassObject::SpawnInstance メソッドを呼び出して、新しいインスタンスを作成します。

    クラスの新規インスタンスを作成してから解放する方法を、次のコード例に示します。

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. IWbemClassObject::Put メソッドを呼び出して、クラスに定義されている値を継承しないプロパティの値を設定します。

    クラスの各インスタンスは、クラスに対して定義されているすべてのプロパティを継承します。 ただし、選択した場合は異なるプロパティ値を指定できます。

    既存のクラスにキー プロパティがある場合は、プロパティを NULL または保証された一意の値に設定する必要があります。 キーを NULL に設定し、キーが文字列である場合、PutInstanceAsync または PutInstance は内部的に GUID を生成してキーに割り当てます。 このように、キー プロパティに NULL を指定すると、前のインスタンスを上書きしない一意のインスタンスを作成できます。

    サンプル インスタンス クラスの Index プロパティの値を設定する方法を次のコード例に示します。

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");
    
    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);
    
  4. IWbemClassObject::GetQualifierSet を呼び出して、関連する修飾子の値を設定します。

    GetQualifierSet メソッドは、クラスまたはインスタンスの修飾子にアクセスするために使用する IWbemQualifierSet インターフェイスへのポインターを返します。 クラス修飾子のフレーバーが EnableOverride の場合は、クラスに対して定義された修飾子に異なる値を指定できます。 フレーバーが DisableOverride に設定されているクラス修飾子を変更または削除することはできません。 詳細については、「修飾子のフレーバー」を参照してください。

    オプションとして、インスタンス クラスの追加の修飾子を定義することもできます。 クラス宣言に表示する必要のないインスタンスまたはインスタンス プロパティに対して、追加の修飾子を定義できます。

  5. IWbemServices::PutInstance または IWbemServices::PutInstanceAsync メソッドを呼び出して、インスタンスを保存します。

    WMI は、現在の WMI 名前空間にインスタンスを保存します。 そのため、インスタンスの完全なパスは名前空間に依存します。これは通常、root\default です。 このコード例では、完全なパス名は \\.\root\default:Example.Index="IX100" になります。

    次のコード例では、インスタンスの保存方法を示します。

        hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
        pNewInstance->Release();
    

インスタンスを WMI に保存すると、インスタンスのいくつかのプロパティがロックダウンされます。

具体的には、WMI インフラストラクチャ内にインスタンスが存在した後、WMI API を介して次のいずれの操作も実行することはできません。

  • インスタンスが属するクラスの親クラスを変更します。
  • プロパティを追加または削除します。
  • プロパティの種類を変更します。
  • キーまたはインデックス付き修飾子を追加または削除します。
  • SingletonDynamic、または Abstract 修飾子を追加または削除します。

次のコード例では、前の手順で説明したコード例を組み合わせて、WMI API を使用してインスタンスを作成する方法を示します。

void CreateInstance (IWbemServices *pSvc)
{
    IWbemClassObject *pNewInstance = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;

    // Get the class definition.
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                 &pExampleClass, &pResult);
    SysFreeString(PathToClass);

    if (hRes != 0)
       return;

    // Create a new instance.
    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more

    VARIANT v;
    VariantInit(&v);

    // Set the Index property (the key).
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");

    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);

    // Set the IntVal property.
    V_VT(&v) = VT_I4;
    V_I4(&v) = 1001;  
    
    BSTR Prop = SysAllocString(L"IntVal");
    pNewInstance->Put(Prop, 0, &v, 0);
    SysFreeString(Prop);
    VariantClear(&v);    
    
    // Other properties acquire the 'default' value specified
    // in the class definition unless otherwise modified here.

    // Write the instance to WMI. 
    hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
    pNewInstance->Release();
}