Erstellen und Deklarieren einer Instanz mit C++

Sie können eine Instanz in C++ über die IWbemServices-Schnittstelle erstellen.

Die Codebeispiele in diesem Thema erfordern die folgende # include-Anweisung, um ordnungsgemäß zu kompilieren.

#include <wbemidl.h>

Im folgenden Verfahren wird beschrieben, wie eine Instanz einer vorhandenen Klasse erstellt wird.

So erstellen Sie eine Instanz einer vorhandenen Klasse

  1. Rufen Sie die Definition der vorhandenen Klasse ab, indem Sie die Methoden IWbemServices::GetObject oder IWbemServices::GetObjectAsync aufrufen.

    Das folgende Codebeispiel zeigt, wie Sie die Methoden GetObject und GetObjectAsync verwenden, um einen Zeiger auf die IWbemClassObject-Schnittstelle zu erhalten, die Zugriff auf die Klassendefinition bietet.

    // 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. Erstellen Sie die neue Instanz, indem Sie die IWbemClassObject::SpawnInstance-Methode aufrufen.

    Das folgende Codebeispiel zeigt, wie eine neue -Instanz erstellt und dann die -Klasse veröffentlicht wird.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Legen Sie Werte für alle Eigenschaften fest, die die für die Klasse definierten Werte nicht erben, indem Sie die IWbemClassObject::P ut-Methode aufrufen.

    Jede Instanz einer Klasse erbt alle Eigenschaften, die für die Klasse definiert sind. Sie können jedoch andere Eigenschaftswerte angeben, wenn Sie dies auswählen.

    Wenn die vorhandene Klasse über eine Schlüsseleigenschaft verfügt, sollten Sie die Eigenschaft entweder auf NULL oder einen garantierten eindeutigen Wert festlegen. Wenn Sie den Schlüssel auf NULL festlegen und der Schlüssel eine Zeichenfolge ist, generiert PutInstanceAsync oder PutInstance intern eine GUID und weist sie dem Schlüssel zu. Auf diese Weise können Sie mit der Angabe von NULL für eine Schlüsseleigenschaft eine eindeutige Instanz erstellen, die keine vorherige Instanz überschreibt.

    Das folgende Codebeispiel zeigt, wie der Index-Eigenschaftswert der Beispielinstanzklasse festgelegt wird.

    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. Legen Sie die Werte für alle relevanten Qualifizierer durch einen Aufruf von IWbemClassObject::GetQualifierSet fest.

    Die GetQualifierSet-Methode gibt einen Zeiger auf eine IWbemQualifierSet-Schnittstelle zurück, die für den Zugriff auf die Qualifizierer für eine Klasse oder Instanz verwendet. Sie können verschiedene Werte für einen für die Klasse definierten Qualifizierer angeben, wenn die Klassenqualifizierer-Variante EnableOverride ist. Sie können einen Klassenqualifizierer nicht ändern oder löschen, wenn die Variante auf DisableOverride festgelegt ist. Weitere Informationen finden Sie unter Qualifizierer-Varianten.

    Optional können Sie auch zusätzliche Qualifizierer für Ihre Instanzklasse definieren. Sie können zusätzliche Qualifizierer für die Instanz- oder Instanzeigenschaft definieren, die nicht in der Klassendeklaration angezeigt werden müssen.

  5. Speichern Sie die Instanz, indem Sie die IWbemServices::P utInstance- oder IWbemServices::P utInstanceAsync-Methode aufrufen.

    WMI speichert die Instanz im aktuellen WMI-Namespace. Daher ist der vollständige Pfad der Instanz vom Namespace abhängig, der in der Regel der Standardstamm \ ist. In diesem Codebeispiel wäre der vollständige Pfadname \ \ . \ root \ default:Example.Index="IX100".

    Im folgenden Codebeispiel wird das Speichern einer -Instanz veranschaulicht.

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

Durch das Speichern der Instanz in WMI werden mehrere Eigenschaften der Instanz gesperrt.

Insbesondere können Sie keine der folgenden Vorgänge über die WMI-API ausführen, nachdem eine Instanz in der WMI-Infrastruktur vorhanden ist:

  • Ändern Sie die übergeordnete Klasse der Klasse, zu der die Instanz gehört.
  • Hinzufügen oder Entfernen von Eigenschaften.
  • Ändern von Eigenschaftentypen.
  • Hinzufügen oder Entfernen von Schlüssel- oder indizierten Qualifizierern.
  • Hinzufügen oder Entfernen von Singleton-, Dynamic- oder Abstract-Qualifizierern.

Im folgenden Codebeispiel werden die im vorherigen Verfahren erläuterten Codebeispiele kombiniert, um zu zeigen, wie eine -Instanz mithilfe der WMI-API erstellt wird.

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();
}