Udostępnij przez


Tworzenie i deklarowanie wystąpienia przy użyciu języka C++

Instancję w C++ można stworzyć za pomocą interfejsu IWbemServices.

Przykłady kodu w tym temacie wymagają następującej instrukcji #include w celu poprawnego skompilowania.

#include <wbemidl.h>

Poniższa procedura opisuje sposób tworzenia wystąpienia istniejącej klasy.

Aby utworzyć wystąpienie istniejącej klasy

  1. Pobierz definicję istniejącej klasy, wywołując metody IWbemServices::GetObject lub IWbemServices::GetObjectAsync.

    Poniższy przykład kodu pokazuje, jak używać GetObject i metod getObjectAsync, aby uzyskać wskaźnik do interfejsu IWbemClassObject, który zapewnia dostęp do definicji klasy.

    // 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. Utwórz nowe wystąpienie, wywołując metodę IWbemClassObject::SpawnInstance.

    W poniższym przykładzie kodu pokazano, jak utworzyć nowe wystąpienie, a następnie zwolnić klasę.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Ustaw wartości dla każdej właściwości, które nie dziedziczą wartości zdefiniowanych dla klasy, wywołując metodę IWbemClassObject::Put.

    Każde wystąpienie klasy dziedziczy wszystkie właściwości zdefiniowane dla klasy. Jednak w przypadku wybrania opcji można określić różne wartości właściwości.

    Jeśli istniejąca klasa ma właściwość klucza, należy ustawić właściwość na wartość null lub gwarantowaną unikatową wartość. Jeśli ustawisz klucz na wartość NULL, a klucz jest ciągiem, PutInstanceAsync lub PutInstance wewnętrznie generuje i przypisuje identyfikator GUID do klucza. W ten sposób określenie NULL dla właściwości klucza umożliwia utworzenie unikatowego wystąpienia, które nie spowoduje zastąpienia żadnego poprzedniego wystąpienia.

    Poniższy przykład kodu pokazuje, jak ustawić wartość właściwości Index przykładowego wystąpienia klasy.

    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. Ustaw wartości dla wszystkich odpowiednich kwalifikatorów za pomocą wywołania metody IWbemClassObject::GetQualifierSet.

    Metoda GetQualifierSet zwraca wskaźnik do interfejsu IWbemQualifierSet, który służy do uzyskiwania dostępu do kwalifikatorów dla klasy lub wystąpienia. Można określić różne wartości kwalifikatora zdefiniowanego dla klasy, o ile właściwość kwalifikatora klasy ma wartość EnableOverride. Nie można zmodyfikować ani usunąć kwalifikatora klasy z ustawionym typem DisableOverride. Aby uzyskać więcej informacji, zobacz kwalifikator smaki .

    Opcjonalnie, można również zdefiniować dodatkowe kwalifikatory dla klasy instancji. Można zdefiniować dodatkowe kwalifikatory dla wystąpienia lub właściwości wystąpienia, które nie muszą być wyświetlane w deklaracji klasy.

  5. Zapisz wystąpienie, wywołując metodę IWbemServices::PutInstance lub IWbemServices::PutInstanceAsync.

    Usługa WMI zapisuje wystąpienie w bieżącej przestrzeni nazw WMI. W związku z tym pełna ścieżka wystąpienia zależy od przestrzeni nazw, która zazwyczaj jest główną\domyślną. W tym przykładzie kodu pełna nazwa ścieżki to \\.\root\default:Example.Index="IX100".

    Poniższy przykład kodu pokazuje, jak zapisać wystąpienie.

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

Zapisanie wystąpienia w usłudze WMI powoduje zablokowanie kilku właściwości wystąpienia.

W szczególności nie można wykonać żadnej z następujących operacji za pośrednictwem interfejsu API usługi WMI po utworzeniu instancji w infrastrukturze WMI.

  • Zmień klasę nadrzędną klasy, do której należy instancja.
  • Dodawanie lub usuwanie właściwości.
  • Zmień typy właściwości.
  • Dodaj lub usuń kwalifikatory key lub Indexed.
  • Dodaj lub usuń Singleton, Dynamiclub Abstract Kwalifikatory.

Poniższy przykład kodu łączy przykłady kodu omówione w poprzedniej procedurze, aby pokazać, jak utworzyć wystąpienie przy użyciu interfejsu API usługi WMI.

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