Erstellen einer WMI-Methode

Um eine WMI-Methode zu erstellen, definieren Sie die Eingabe- und Ausgabeparameter für die Methode. Die Eingabe- und Ausgabeparameter werden durch eine spezielle WMI-Systemklasse __PARAMETERS dargestellt. Weitere Informationen finden Sie unter Aufrufen einer Methode und Schreiben eines Methodenanbieters.

Die folgenden Abschnitte werden in diesem Thema behandelt:

Erstellen einer WMI-Klassenmethode in MOF

In WMI sind Anbietermethoden im Allgemeinen unterschiedliche Aktionen im Zusammenhang mit dem Objekt, das von der Klasse darstellt wird. Anstatt den Wert einer Eigenschaft zum Ausführen einer Aktion zu ändern, sollte eine Methode erstellt werden. Sie können beispielsweise ein Netzwerkinformationszentrum (Network Information Center, NIC) aktivieren oder deaktivieren, das durch Win32_NetworkAdapter dargestellt wird, indem Sie die Methoden Enable und Disable verwenden. Während diese Aktionen als Lese-/Schreibeigenschaft dargestellt werden können, wird empfohlen, eine Methode zu erstellen. Wenn Sie alternativ einen Zustand oder Wert für die Klasse sichtbar machen möchten, empfiehlt es sich, anstelle einer Methode eine Lese-/Schreibeigenschaft zu erstellen. In Win32_NetworkAdapter macht die Eigenschaft NetEnabled den Zustand des Adapters sichtbar, aber Änderungen zwischen den Zuständen werden durch die Methoden Enable oder Disable ausgeführt.

Klassendeklarationen können die Deklaration einer oder mehrerer Methoden enthalten. Sie können entweder die Methoden einer übergeordneten Klasse übernehmen oder Ihre eigene implementieren. Wenn Sie ihre eigenen Methoden implementieren möchten, müssen Sie die Methode deklarieren und die Methode mit bestimmten Qualifizierertags markieren.

Im folgenden Verfahren wird beschrieben, wie eine Methode in einer Klasse deklariert wird, die nicht von einer Basisklasse erbt.

So deklarieren Sie eine Methode

  1. Definieren Sie den Namen Ihrer Methode zwischen den geschweiften Klammern einer Klassendeklaration, gefolgt von allen Qualifizierern.

    Im folgenden Codebeispiel wird die Syntax für eine Methode beschrieben.

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. Fügen Sie anschließend Ihren MOF (Managed Object Format)-Code mit einem Aufruf des MOF-Compilers in das WMI-Repository ein.

    Weitere Informationen finden Sie unter Kompilieren von MOF-Dateien.

Die folgende Liste definiert die Elemente der Methodendeklaration.

Anbieter

Verknüpft einen bestimmten Anbieter mit Ihrer Klassenbeschreibung. Der Wert des Qualifizierers Anbieter ist der Name des Anbieters, der WMI mitteilt, wo sich der Code befindet, der Ihre Methode unterstützt. Ein Anbieter sollte auch jede Klasse mit dynamischen Instanzen mit dem Qualifizierer Dynamisch markieren. Verwenden Sie im Gegensatz dazu den Qualifizierer Dynamisch nicht, um eine Klasse zu markieren, die eine statische Instanz mit Implemented-Methoden enthält.

Implementiert

Deklariert, dass Sie eine Methode implementieren, anstatt die Methodenimplementierung von der übergeordneten Klasse zu übernehmen. Standardmäßig verteilt WMI die Implementierung der übergeordneten Klasse an eine abgeleitete Klasse, es sei denn, die abgeleitete Klasse stellt eine Implementierung bereit. Das Weglassen des Qualifizierers Implementiert zeigt an, dass die Methode keine Implementierung in dieser Klasse aufweist. Wenn Sie eine Methode ohne den Qualifizierer Implementiert neu deklarieren, geht WMI weiterhin davon aus, dass Sie diese Methode nicht implementieren werden, und ruft beim Aufruf die Methodenimplementierung der übergeordneten Klasse auf. Daher ist das erneute Deklarieren einer Methode in einer abgeleiteten Klasse ohne Anfügen des Qualifizierers Implementiert nur nützlich, wenn Sie der Methode einen Qualifizierer hinzufügen oder daraus entfernen.

ReturnType

Beschreibt den Wert, den die Methode zurückgibt. Der Rückgabewert für eine Methode muss ein Objekt vom Typ „Boolesch“, „Numerisch“, CHAR, STRING, DATETIME oder „Schema“ sein. Sie können den Rückgabetyp auch als VOID deklarieren, was angibt, dass die Methode nichts zurückgibt. Sie können jedoch kein Array als Rückgabewerttyp deklarieren.

MethodName

Definiert den Namen der Methode. Jede Methode muss einen eindeutigen Namen haben. WMI lässt nicht zu, dass zwei Methoden mit demselben Namen und unterschiedlichen Signaturen in einer Klasse oder innerhalb einer Klassenhierarchie vorhanden sind. Daher können Sie eine Methode auch nicht überladen.

ParameterDirection

Enthält Qualifizierer, die beschreiben, ob ein Parameter ein Eingabeparameter, ein Ausgabeparameter oder beides ist. Verwenden Sie denselben Parameternamen nicht mehrmals als Eingabeparameter oder mehrmals als Ausgabeparameter. Wenn derselbe Parametername mit den Qualifizierern Ein und Aus angezeigt wird, ist die Funktionalität konzeptionell identisch mit der Verwendung der Qualifizierer Ein oder Aus für einen einzelnen Parameter. Bei Verwendung separater Deklarationen müssen die Eingabe- und Ausgabeparameter jedoch in allen anderen Aspekten genau identisch sein, einschließlich der Anzahl und des Typs der ID-Qualifizierer, und der Qualifizierer muss für beide identisch und explizit deklariert sein. Es wird dringend empfohlen, die Qualifizierer Ein und Aus innerhalb einer einzelnen Parameterdeklaration zu verwenden.

IDQualifier

Enthält den ID-Qualifizierer, der die Position der einzelnen Parameter innerhalb der Parametersequenz in der Methode eindeutig festlegt. Standardmäßig markiert der MOF-Compiler Parameter automatisch mit einem ID-Qualifizierer. Der Compiler markiert den ersten Parameter mit dem Wert 0 (null), den zweiten Parameter mit dem Wert 1 (eins) usw. Bei Bedarf können Sie die ID-Sequenz explizit in Ihrem MOF-Code angeben.

ParameterType

Beschreibt, welchen Datentyp die Methode akzeptieren kann. Sie können einen Parametertyp als jeden MOF-Datenwert definieren, einschließlich eines Arrays, Schemaobjekts oder Verweises. Wenn Sie ein Array als Parameter verwenden, verwenden Sie das Array als ungebunden oder mit einer expliziten Größe.

ParameterName

Enthält den Namen des Parameters. Sie können auch den Standardwert des Parameters an diesem Punkt definieren. Parameter ohne Anfangswerte bleiben nicht zugewiesen.

Im folgenden Codebeispiel werden Parameterauflistung und Qualifizierer beschrieben.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] sint32 InParam);
    [Implemented] 
    void MyMethod2 ([in, id(0)] sint32 InParam, 
       [out, id(1)] sint32 OutParam);
    [Implemented] 
    sint32 MyMethod3 ([in, out, id(0)] sint32 InOutParam);
};

Im folgenden Codebeispiel wird die Verwendung eines Arrays in einem MOF-Parameter beschrieben.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk DiskParam[]);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] Win32_LogicalDisk DiskParam[32]);
};

Im folgenden Codebeispiel wird die Verwendung eines Schemaobjekts sowohl als Parameter als auch als Rückgabewert beschrieben.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk 
        DiskParam);
    [Implemented] 
    Win32_LogicalDisk MyMethod2 ([in, id(0)] string DiskVolLabel);
};

Im folgenden Codebeispiel wird beschrieben, wie zwei Verweise eingeschlossen werden: einer auf eine Instanz der Win32_LogicalDisk-Klasse und der andere auf eine Instanz eines unbekannten Objekttyps.

[Dynamic, Provider("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk ref DiskRef);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] object ref AnyObject);
};

Erstellen einer WMI-Klassenmethode in C++

Im folgenden Verfahren wird beschrieben, wie eine WMI-Klassenmethode programmgesteuert erstellt wird.

So erstellen Sie programmgesteuert eine WMI-Klassenmethode

  1. Erstellen Sie die Klasse, zu der die Methode gehört.

    Sie müssen zuerst über eine Klasse verfügen, in der die Methode platziert werden kann, bevor Sie die Methode erstellen.

  2. Rufen Sie zwei untergeordnete Klassen der __PARAMETERS-Systemklasse mithilfe von IWbemServices::GetObject oder GetObjectAsync ab.

    Verwenden Sie die erste untergeordnete Klasse, um die Eingabeparameter zu beschreiben, und die zweite, um die Ausgabeparameter zu beschreiben. Bei Bedarf können Sie einen einzelnen Abruf ausführen, gefolgt von einem Aufruf der IWbemClassObject::Clone-Methode.

  3. Schreiben Sie die Eingabeparameter in die erste Klasse und die Ausgabeparameter in die zweite Klasse, indem Sie einen oder mehrere Aufrufe von IWbemClassObject::Put verwenden.

    Beachten Sie beim Beschreiben von Parametern für eine Methode die folgenden Regeln und Einschränkungen:

    • Behandeln Sie die Parameter [Eingabe, Ausgabe] als separate Einträge, einen im Objekt, das die Eingabeparameter enthält, und einen im Objekt, das die Ausgabeparameter enthält.

    • Abgesehen von den [Eingabe, Ausabe]-Qualifizierern müssen die restlichen Qualifizierer genau die gleichen sein.

    • Geben Sie die ID-Qualifizierer an, beginnend bei 0 (null), einen für jeden Parameter.

      Die Reihenfolge der Eingabe- oder Ausgabeparameter wird durch den Wert des ID-Qualifizierers für jeden Parameter festgelegt. Alle Eingabeargumente müssen allen Ausgabeargumenten vorangestellt werden. Das Ändern der Reihenfolge der Methodeneingabe- und Ausgabeparameter beim Aktualisieren eines vorhandenen Methodenanbieters kann dazu führen, dass Anwendungen, die die Methode aufrufen, fehlschlagen. Fügen Sie neue Eingabeparameter am Ende der vorhandenen Parameter hinzu, anstatt sie in die bereits festgelegte Sequenz einzufügen.

      Achten Sie darauf, keine Lücken in der ID-Qualifizierersequenz zu hinterlassen.

    • Platzieren Sie den Rückgabewert in der Ausgabeparameter-Klasse als Eigenschaft mit dem Namen ReturnValue.

      Dadurch wird die Eigenschaft als Rückgabewert der Methode identifiziert. Der CIM-Typ dieser Eigenschaft ist der Rückgabetyp der -Methode. Wenn die Methode den Rückgabetyp „VOID“ aufweist, dann sollten Sie überhaupt keine ReturnValue-Eigenschaft verwenden. Außerdem kann die ReturnValue-Eigenschaft keinen ID-Qualifizierer aufweisen, so wie die Argumente der Methode. Das Zuweisen eines ID-Qualifizierers zur ReturnValue-Eigenschaft führt zu einem WMI-Fehler.

    • Geben Sie alle Standardwerte für die Eigenschaft in der Klasse an.

  4. Platzieren Sie beide __PARAMETERS-Objekte in der übergeordneten Klasse mit einem Aufruf von IWbemClassObject::PutMethod.

    Ein einzelner Aufruf von PutMethod kann beide __PARAMETERS-Objekte in der Klasse platzieren.

Erstellen einer Klasse