Sdílet prostřednictvím


Vytvoření odvozené třídy WMI

Vytvoření odvozené třídy ve službě WMI je velmi podobné vytvoření základní třídy. Stejně jako u základní třídy musíte nejprve definovat odvozenou třídu a potom zaregistrovat odvozenou třídu ve službě WMI. Hlavním rozdílem je, že musíte nejprve vyhledat nadřazenou třídu, ze které chcete odvodit. Další informace naleznete v sekci Psaní poskytovatele třídy a Psaní poskytovatele instance.

Doporučený způsob vytváření tříd pro zprostředkovatele je v souborech MOF (Managed Object Format). Několik odvozených tříd, které spolu vzájemně souvisí, by měly být seskupeny do souboru MOF spolu s všemi základními třídami, ze kterých odvozují vlastnosti nebo metody. Pokud každou třídu umístíte do samostatného souboru MOF, musí být každý soubor zkompilován, aby poskytovatel mohl správně fungovat.

Po vytvoření třídy musíte před provedením jakékoli z následujících aktivit v odvozené třídě odstranit všechny instance třídy:

  • Změňte nadřazenou třídu vaší odvozené třídy.
  • Přidejte nebo odeberte vlastnosti.
  • Umožňuje změnit typy vlastností.
  • Přidejte nebo odeberte key nebo indexované kvalifikátory.
  • Přidejte nebo odeberte kvalifikátory Singleton, Dynamickénebo Abstraktní.

Poznámka

Pokud chcete přidat, odebrat nebo upravit vlastnost nebo kvalifikátor, zavolejte IWbemServices::PutClass nebo SWbemObject.Put_ a nastavte parametr příznaku na "force mode". Kvalifikátor Abstraktní lze použít pouze v případě, že nadřazená třída je abstraktní.

 

Při deklaraci odvozené třídy dodržujte následující pravidla a omezení:

  • Nadřazená třída odvozené třídy již musí existovat.

    Deklarace nadřazené třídy se může zobrazit ve stejném souboru MOF jako odvozená třída nebo v jiném souboru. Pokud nadřazená třída není známa, kompilátor vygeneruje chybu za běhu.

  • Odvozená třída může mít pouze jednu nadřazenou třídu.

    WMI nepodporuje vícenásobnou dědičnost. Nadřazená třída však může mít mnoho odvozených tříd.

  • Můžete definovat indexy pro odvozené třídy, ale rozhraní WMI tyto indexy nepoužívá.

    Proto zadání indexu v odvozené třídě nezlepší výkon dotazů pro instance odvozené třídy. Výkon dotazu na odvozenou třídu můžete zlepšit zadáním indexovaných vlastností pro nadřazenou třídu odvozené třídy.

  • Definice odvozené třídy mohou být složitější a mohou zahrnovat například aliasy, kvalifikátory a varianty kvalifikátorů.

    Další informace najdete v tématu Vytvoření aliasu a Přidání kvalifikátoru.

  • Pokud chcete změnit kvalifikátor, změňte výchozí hodnotu vlastnosti základní třídy nebo silněji zadejte odkaz nebo vloženou vlastnost objektu základní třídy, musíte znovu deklarovat celou základní třídu.

  • Maximální počet vlastností, které můžete definovat ve třídě WMI, je 1024.

Poznámka

Třídy nelze během provádění zprostředkovatelů změnit. Musíte zastavit aktivitu, změnit třídu a poté restartovat službu Windows Management. Zjištění změny třídy v současné době není možné.

 

Stejně jako u základní třídy bude nejběžnějším použitím této techniky klientské aplikace. Zprostředkovatel však může také vytvořit odvozenou třídu. Další informace naleznete v tématu Vytvoření základní třídy a v Zápis zprostředkovatele třídy.

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

#include <wbemidl.h>

Následující postup popisuje, jak vytvořit odvozenou třídu pomocí jazyka C++.

Vytvoření odvozené třídy pomocí jazyka C++

  1. Vyhledejte základní třídu pomocí volání IWbemServices::GetObject.

    Následující příklad kódu ukazuje, jak najít Příklad základní třídy.

    // 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. Vytvořte odvozený objekt ze základní třídy s voláním IWbemClassObject::SpawnDerivedClass.

    Následující příklad kódu ukazuje, jak vytvořit odvozený objekt třídy.

    pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
    pExampleClass->Release();  // Don't need the parent class any more
    
  3. Vytvořte název třídy nastavením vlastnosti systému __CLASS voláním metody IWbemClassObject::P ut.

    Následující příklad kódu ukazuje, jak přiřadit název odvozené třídy.

    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. Vytvořte další vlastnosti pomocí IWbemClassObject::Put.

    Následující příklad kódu ukazuje, jak vytvořit další vlastnosti.

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. Uložte novou třídu voláním IWbemServices::PutClass.

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

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

Následující příklad kódu kombinuje příklady kódu popsané v předchozím postupu a popisuje, jak vytvořit odvozenou třídu pomocí rozhraní WMI API.

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

Následující postup popisuje, jak definovat odvozenou třídu pomocí kódu MOF.

Definování odvozené třídy pomocí kódu MOF

  1. Definujte odvozenou třídu s klíčovým slovem Class, za kterým následuje název odvozené třídy a název nadřazené třídy oddělené dvojtečku.

    Následující příklad kódu popisuje implementaci odvozené třídy.

    class MyClass 
    {
        [key] string   strProp;
        sint32   dwProp1;
        uint32       dwProp2;
    };
    
    class MyDerivedClass : MyClass
    {
        string   strDerivedProp;
        sint32   dwDerivedProp;
    };
    
  2. Po dokončení zkompilujte kód MOF pomocí kompilátoru MOF.

    Další informace najdete v tématu Kompilace souborů MOF.

Vytvoření třídy