Dela via


Skapa en WMI-härledd klass

Att skapa en härledd klass i WMI liknar att skapa en basklass. Precis som med en basklass måste du först definiera den härledda klassen och sedan registrera den härledda klassen med WMI. Den största skillnaden är att du först måste hitta den överordnade klass som du vill härleda från. Mer information finns i Skriva en klassprovider och Skriva en instansprovider.

Det rekommenderade sättet att skapa klasser för en provider är i MOF-filer (Managed Object Format). Flera härledda klasser som är relaterade till varandra bör grupperas i en MOF-fil, tillsammans med eventuella basklasser som de härleder egenskaper eller metoder från. Om du placerar varje klass i en separat MOF-fil måste varje fil kompileras innan providern kan fungera korrekt.

När du har skapat klassen måste du ta bort alla instanser av klassen innan du kan utföra någon av följande aktiviteter i din härledda klass:

  • Ändra den överordnade klassen för din härledda klass.
  • Lägg till eller ta bort egenskaper.
  • Ändra egenskapstyper.
  • Lägg till eller ta bort nyckel eller indexerade kvalificerare.
  • Lägg till eller ta bort Singleton, Dynamiceller Abstract kvalifikatorer.

Notera

Om du vill lägga till, ta bort eller ändra en egenskap eller kvalificerare, anropar du IWbemServices::PutClass eller SWbemObject.Put_ och anger flaggparametern till "force mode". Abstrakt kvalificerare kan bara användas om den överordnade klassen är abstrakt.

 

När du deklarerar din härledda klass följer du följande regler och begränsningar:

  • Den överordnade klassen för den härledda klassen måste redan finnas.

    Deklarationen för den överordnade klassen kan visas i samma MOF-fil som den härledda klassen eller i en annan fil. Om den överordnade klassen är okänd genererar kompilatorn ett körningsfel.

  • En härledd klass kan bara ha en enda överordnad klass.

    WMI stöder inte flera arv. En överordnad klass kan dock ha många härledda klasser.

  • Du kan definiera index för härledda klasser, men WMI använder inte dessa index.

    Att ange ett index för en härledd klass förbättrar därför inte prestandan för frågor för instanser av den härledda klassen. Du kan förbättra prestanda för en fråga i en härledd klass genom att ange indexerade egenskaper för den överordnade klassen för den härledda klassen.

  • Härledda klassdefinitioner kan vara mer komplexa och kan innehålla funktioner som alias, kvalificerare och kvalsmak.

    Mer information finns i Skapa ett alias och Lägga till en kvalificerare.

  • Om du vill ändra en kvalificerare, ändra standardvärdet för en basklassegenskap eller starkare ange en referens- eller inbäddad objektegenskap för en basklass, måste du deklarera hela basklassen igen.

  • Det maximala antalet egenskaper som du kan definiera i en WMI-klass är 1024.

Anteckning

Det går inte att ändra klasser under körning av leverantörer. Du måste stoppa aktiviteten, ändra klassen och sedan starta om Windows Management-tjänsten. Det går för närvarande inte att identifiera en klassändring.

 

Precis som med basklassen är den vanligaste användningen av den här tekniken av klientprogram. En provider kan dock också skapa en härledd klass. Mer information finns i Skapa en basklass och Skriva en klassleverantör.

Kodexemplet i det här avsnittet kräver följande #include-instruktion för att kompilera korrekt.

#include <wbemidl.h>

Följande procedur beskriver hur du skapar en härledd klass med C++.

Skapa en härledd klass med C++

  1. Leta upp basklassen med ett anrop till IWbemServices::GetObject.

    Följande kodexempel visar hur du hittar basklassen Exempel.

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewDerivedClass = 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. Skapa ett härlett objekt från basklassen med ett anrop till IWbemClassObject::SpawnDerivedClass.

    I följande kodexempel visas hur du skapar ett härlett klassobjekt.

    pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
    pExampleClass->Release();  // Don't need the parent class any more
    
  3. Upprätta ett namn för klassen genom att ange __CLASS-systemegenskapen med ett anrop till metoden IWbemClassObject::Put.

    I följande kodexempel visas hur du tilldelar ett namn till den härledda klassen.

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"Example2");
    BSTR Class = SysAllocString(L"__CLASS");
    pNewDerivedClass->Put(Class, 0, &v, 0);
    SysFreeString(Class);
    VariantClear(&v);
    
  4. Skapa ytterligare egenskaper med IWbemClassObject::Put.

    Följande kodexempel visar hur du skapar ytterligare egenskaper.

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. Spara den nya klassen genom att anropa IWbemServices::PutClass.

    Följande kodexempel visar hur du sparar den nya härledda klassen.

    hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
    pNewDerivedClass->Release();
    

I följande kodexempel kombineras de kodexempel som beskrevs i föregående procedur för att beskriva hur du skapar en härledd klass med hjälp av WMI-API:et.

void CreateDerivedClass(IWbemServices *pSvc)
{
  IWbemClassObject *pNewDerivedClass = 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);

  if (hRes != 0)
    return;

  pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
  pExampleClass->Release();  // The parent class is no longer needed

  VARIANT v;
  VariantInit(&v);

  // Create the class name.
  // =====================

  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"Example2");
  BSTR Class = SysAllocString(L"__CLASS");
  pNewDerivedClass->Put(Class, 0, &v, 0);
  SysFreeString(Class);
  VariantClear(&v);

  // Create another property.
  // =======================
  BSTR OtherProp = SysAllocString(L"OtherInfo2");
  // No default value
  pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
  SysFreeString(OtherProp);
  
  // Register the class with WMI. 
  // ============================
  hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult);
  pNewDerivedClass->Release();
}

Följande procedur beskriver hur du definierar en härledd klass med hjälp av MOF-kod.

Definiera en härledd klass med hjälp av MOF-kod

  1. Definiera din härledda klass med nyckelordet class följt av namnet på din härledda klass och namnet på den överordnade klassen avgränsad med ett kolon.

    I följande kodexempel beskrivs en implementering av en härledd klass.

    class MyClass 
    {
        [key] string   strProp;
        sint32   dwProp1;
        uint32       dwProp2;
    };
    
    class MyDerivedClass : MyClass
    {
        string   strDerivedProp;
        sint32   dwDerivedProp;
    };
    
  2. Kompilera MOF-koden med MOF-kompilatorn när det är klart.

    Mer information finns i Kompilera MOF-filer.

Skapa en klass