Erstellen und Deklarieren einer Instanz mit C++
Sie können eine Instanz in C++ über die Schnittstelle IWbemServices erstellen.
Für die Codebeispiele in diesem Thema ist die folgende #include-Anweisung erforderlich, um ordnungsgemäß kompiliert zu werden.
#include <wbemidl.h>
Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz einer vorhandenen Klasse erstellen.
So erstellen Sie eine Instanz einer vorhandenen Klasse
Rufen Sie die Definition der vorhandenen Klasse ab, indem Sie die Methoden IWbemServices::GetObject oder IWbemServices::GetObjectAsync aufrufen.
Im folgenden Codebeispiel wird gezeigt, wie sie mit den Methoden GetObject und GetObjectAsync einen Zeiger auf die Schnittstelle IWbemClassObject abrufen, die Zugriff auf die Klassendefinition ermöglicht.
// 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);
Erstellen Sie die neue Instanz, indem Sie die Methode IWbemClassObject::SpawnInstance aufrufen.
Im folgenden Codebeispiel wird gezeigt, wie eine neue Instanz der Klasse erstellt und anschließend freigegeben wird.
pExampleClass->SpawnInstance(0, &pNewInstance); pExampleClass->Release(); // Don't need the class any more
Legen Sie Werte für alle Eigenschaften fest, die die für die Klasse definierten Werte nicht erben, indem Sie die Methode IWbemClassObject::Put aufrufen.
Jede Instanz einer Klasse erbt alle Eigenschaften, die für die Klasse definiert sind. Sie können jedoch bei Bedarf unterschiedliche Eigenschaftswerte angeben.
Wenn die vorhandene Klasse über eine Schlüsseleigenschaft verfügt, sollten Sie die Eigenschaft entweder auf NULL oder auf 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 und weist dem Schlüssel eine GUID zu. Auf diese Weise können Sie durch Angeben von NULL für eine Schlüsseleigenschaft eine eindeutige Instanz erstellen, die keine vorherigen Instanz überschreibt.
Im folgenden Codebeispiel ist dargestellt, wie der Wert der Eigenschaftswert Index 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);
Legen Sie die Werte für alle relevanten Qualifizierer über einen Aufruf von IWbemClassObject::GetQualifierSet fest.
Die Methode GetQualifierSet gibt einen Zeiger auf eine Schnittstelle IWbemQualifierSet zurück, die verwendet wird, um auf die Qualifizierer für eine Klasse oder Instanz zuzugreifen. Sie können unterschiedliche Werte für einen für die Klasse definierten Qualifizierer angeben, wenn der Klassenqualifizierertyp EnableOverride ist. Sie können einen Klassenqualifizierer nicht ändern oder löschen, bei dem der Typ auf DisableOverride festgelegt ist. Weitere Informationen finden Sie unter Qualifizierertypen.
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.
Speichern Sie die Instanz, indem Sie die Methoden IWbemServices::PutInstance oder IWbemServices::PutInstanceAsync 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 root\default ist. In diesem Codebeispiel lautet der vollständige Pfadname \\.\root\default:Example.Index="IX100".
Im folgenden Codebeispiel wird veranschaulicht, wie Sie eine Instanz speichern.
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 innerhalb der WMI-Infrastruktur eine Instanz vorhanden ist:
- Ändern Sie die übergeordnete Klasse der Klasse, zu der die Instanz gehört.
- Fügen Sie Eigenschaften hinzu oder entfernen Sie Eigenschaften.
- Ändern Sie Eigenschaftstypen .
- Fügen Sie die Qualifizierer Keyoder Indexed hinzu oder entfernen Sie sie.
- Fügen Sie die Qualifizierer Singleton, Dynamic oder Abstract hinzu oder entfernen Sie sie.
Im folgenden Codebeispiel werden die im vorherigen Verfahren erläuterten Codebeispiele kombiniert, um zu zeigen, wie Sie mithilfe der WMI-API eine Instanz erstellen.
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();
}