Sdílet prostřednictvím


Vytvoření a deklarace instance pomocí jazyka C++

Instanci v jazyce C++ můžete vytvořit prostřednictvím rozhraní IWbemServices.

Příklady kódu v tomto tématu vyžadují, aby se správně zkompiloval následující příkaz #include.

#include <wbemidl.h>

Následující postup popisuje, jak vytvořit instanci existující třídy.

Vytvoření instance existující třídy

  1. Načíst definici existující třídy voláním metod IWbemServices::GetObject nebo IWbemServices::GetObjectAsync.

    Následující příklad kódu ukazuje, jak použít metody GetObject a GetObjectAsync k získání ukazatele na rozhraní IWbemClassObject, které poskytuje přístup k definici třídy.

    // 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. Vytvořte novou instanci voláním IWbemClassObject::SpawnInstance metoda.

    Následující příklad kódu ukazuje, jak vytvořit novou instanci a pak vydat třídu.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Nastavte hodnoty pro všechny vlastnosti, které nedědí hodnoty definované pro třídu voláním IWbemClassObject::P ut metoda.

    Každá instance třídy dědí všechny vlastnosti, které jsou definovány pro třídu. Pokud ale zvolíte, můžete zadat jiné hodnoty vlastností.

    Pokud má existující třída klíčovou vlastnost, měli byste vlastnost nastavit buď na NULL nebo zaručenou jedinečnou hodnotu. Pokud klíč nastavíte na null a klíč je řetězec, PutInstanceAsync nebo PutInstance interně vygeneruje a přiřadí identifikátor GUID ke klíči. Zadáním NULL pro vlastnost klíče můžete vytvořit jedinečnou instanci, která nepřepíše žádnou předchozí instanci.

    Následující příklad kódu ukazuje, jak nastavit Index hodnotu vlastnosti ukázkové třídy instance.

    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. Nastavte hodnoty pro všechny relevantní kvalifikátory prostřednictvím volání IWbemClassObject::GetQualifierSet.

    Metoda GetQualifierSet vrátí ukazatel na rozhraní IWbemQualifierSet, které slouží pro přístup ke kvalifikátorům třídy nebo instance. Pokud je typ kvalifikátoru třídy EnableOverride, můžete pro kvalifikátor definovaný pro třídu zadat různé hodnoty. Není možné upravit ani odstranit kvalifikátor třídy, pokud má příchuť nastavenou na DisableOverride. Další informace naleznete v tématu kvalifikátor příchutí.

    Jako možnost můžete také definovat další kvalifikátory pro třídu instance. Můžete definovat další kvalifikátory pro instanci nebo vlastnost instance, které nemusí být zobrazeny v deklaraci třídy.

  5. Uložte instanci voláním metod IWbemServices::PutInstance nebo IWbemServices::PutInstanceAsync.

    WMI uloží instanci do aktuálního oboru názvů. Úplná cesta instance je proto závislá na oboru názvů, což je obvykle root\default. V tomto příkladu kódu by úplný název cesty byl \\.\root\default:Example.Index="IX100".

    Následující příklad kódu ukazuje, jak uložit instanci.

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

Uložení instance do rozhraní WMI uzamkne několik vlastností instance.

Konkrétně není možné provádět žádné z následujících operací prostřednictvím rozhraní WMI API po existenci instance v rámci infrastruktury rozhraní WMI:

  • Změňte nadřazenou třídu třídy, do které instance patří.
  • Přidejte nebo odeberte vlastnosti.
  • Umožňuje změnit typy vlastností.
  • Přidejte nebo odeberte key nebo indexované kvalifikátory.
  • Přidejte nebo odeberte Singleton, dynamickýnebo abstraktní kvalifikátory.

Následující příklad kódu kombinuje příklady kódu probírané v předchozím postupu a ukazuje, jak vytvořit instanci pomocí rozhraní 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();
}