Delen via


Een instantie maken en definiëren met C++

U kunt een exemplaar in C++ maken via de interface IWbemServices.

Voor de codevoorbeelden in dit onderwerp is de volgende #include instructie vereist om correct te compileren.

#include <wbemidl.h>

In de volgende procedure wordt beschreven hoe u een exemplaar van een bestaande klasse maakt.

Een exemplaar van een bestaande klasse maken

  1. Haal de definitie van de bestaande klasse op door de IWbemServices::GetObject- of IWbemServices::GetObjectAsync methoden aan te roepen.

    In het volgende codevoorbeeld ziet u hoe u de GetObject- en GetObjectAsync- methoden gebruikt om een aanwijzer op te halen naar de IWbemClassObject-interface die toegang biedt tot de klassedefinitie.

    // 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. Roep de methode IWbemClassObject::SpawnInstance aan om het nieuwe exemplaar te maken.

    In het volgende codevoorbeeld ziet u hoe u een nieuw exemplaar maakt en vervolgens de klasse vrijgeeft.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. Stel waarden in voor eigenschappen die niet de waarden overnemen die voor de klasse zijn gedefinieerd door de methode IWbemClassObject::P ut aan te roepen.

    Elk exemplaar van een klasse neemt alle eigenschappen over die zijn gedefinieerd voor de klasse. U kunt echter verschillende eigenschapswaarden opgeven als u kiest.

    Als de bestaande klasse een sleuteleigenschap heeft, moet u de eigenschap instellen op NULL- of een gegarandeerde unieke waarde. Als u de sleutel instelt op NULL- en de sleutel een tekenreeks is, PutInstanceAsync- of PutInstance intern een GUID aan de sleutel genereert en toewijst. Als u op deze manier NULL- opgeeft voor een sleuteleigenschap, kunt u een uniek exemplaar maken dat geen eerdere exemplaren overschrijft.

    In het volgende codevoorbeeld ziet u hoe u de eigenschapswaarde Index van de voorbeeldexemplarenklasse instelt.

    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. Stel de waarden voor relevante kwalificaties in via een aanroep naar IWbemClassObject::GetQualifierSet.

    De methode GetQualifierSet retourneert een aanwijzer naar een IWbemQualifierSet interface, die wordt gebruikt om toegang te krijgen tot de kwalificatie voor een klasse of instantie. U kunt verschillende waarden opgeven voor een kwalificatie die bij de klasse is gedefinieerd, wanneer de klassekwalificatiesmaak EnableOverrideis. U kunt een klassekwalificatie waarvan de flavor is ingesteld op DisableOverrideniet wijzigen of verwijderen. Zie Qualifier Flavorsvoor meer informatie.

    Als optie kunt u ook aanvullende kwalificaties voor uw exemplaarklasse definiëren. U kunt aanvullende kwalificaties definiëren voor de instantie- of instantie-eigenschap die niet hoeft te worden weergegeven in de klassedeclaratie.

  5. Sla het exemplaar op door de methode IWbemServices::PutInstance of IWbemServices::PutInstanceAsync aan te roepen.

    WMI slaat het exemplaar op in de huidige WMI-naamruimte. Als zodanig is het volledige pad van het exemplaar afhankelijk van de naamruimte, die doorgaans root\default is. Voor dit codevoorbeeld is de volledige padnaam \\.\root\default:Example.Index="IX100".

    In het volgende codevoorbeeld wordt getoond hoe u een instantie opslaat.

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

Het opslaan van het exemplaar in WMI legt verschillende eigenschappen van het exemplaar vast.

U kunt met name geen van de volgende bewerkingen uitvoeren via de WMI-API nadat een exemplaar in de WMI-infrastructuur bestaat:

  • Wijzig de bovenliggende klasse van de klasse waartoe het exemplaar behoort.
  • Eigenschappen toevoegen of verwijderen.
  • Wijzig eigenschappentypen.
  • Voeg key of geïndexeerde kwalificaties toe of verwijder deze.
  • Toevoegen of verwijderen van Singleton, Dynamic, of Abstract kwalificaties.

In het volgende codevoorbeeld worden de codevoorbeelden gecombineerd die in de vorige procedure zijn besproken om te laten zien hoe u een exemplaar maakt met behulp van de 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();
}