共用方式為


建立 WMI 衍生類別

在 WMI 中建立衍生類別非常類似于建立基類。 如同基類,您必須先定義衍生類別,然後使用 WMI 註冊衍生類別。 主要差異在於,您必須先找出要從中衍生的父類別。 如需詳細資訊,請參閱 撰寫類別提供者寫入執行個體提供者

為提供者建立類別的建議方法是使用 Managed 物件格式 (MOF) 檔案。 與彼此相關的數個衍生類別應該分組成 MOF 檔案,以及衍生屬性或方法的任何基類。 如果您將每個類別放在個別的 MOF 檔案中,則必須編譯每個檔案,提供者才能正常運作。

建立類別之後,您必須先刪除類別的所有實例,才能在衍生類別上執行下列任何活動:

  • 變更衍生類別的父類別。
  • 新增或移除屬性。
  • 變更屬性類型。
  • 新增或移除 索引鍵索引 限定詞。
  • 新增或移除 SingletonDynamicAbstract 限定 符。

注意

若要新增、移除或修改屬性或限定詞,請呼叫 IWbemServices::P utClassSWbemObject.Put_ ,並將旗標參數設定為 「force mode」。 只有在父類別是 抽象時 ,才能使用抽象限定詞。

 

當您宣告衍生類別時,請觀察下列規則和限制:

  • 衍生類別的父類別必須已經存在。

    父類別的宣告可以出現在與衍生類別相同的 MOF 檔案中,或出現在不同的檔案中。 如果父類別未知,編譯器會產生執行階段錯誤。

  • 衍生類別只能有單一父類別。

    WMI 不支援多重繼承。 不過,父類別可以有許多衍生類別。

  • 您可以定義衍生類別的索引,但 WMI 不會使用這些索引。

    因此,在衍生類別上指定索引並不會改善衍生類別實例之查詢的效能。 您可以為衍生類別的父類別指定索引屬性,以改善衍生類別的查詢效能。

  • 衍生類別定義可能更為複雜,而且可以包含別名、限定詞和限定詞類別等功能。

    如需詳細資訊,請參閱 建立別名新增限定詞

  • 如果您想要變更限定詞,請變更基類屬性的預設值,或更強式地輸入基類的參考或内嵌物件屬性,您必須再次宣告整個基類。

  • 您可以在 WMI 類別中定義的屬性數目上限為 1024。

注意

類別在執行提供者期間無法變更。 您必須停止活動、變更 類別,然後重新開機 Windows 管理服務。 目前無法偵測類別變更。

 

和基類一樣,用戶端應用程式最常使用這項技術。 不過,提供者也可以建立衍生類別。 如需詳細資訊,請參閱 建立基類撰寫類別提供者

本主題中的程式碼範例需要下列#include語句才能正確編譯。

#include <wbemidl.h>

下列程式描述如何使用 C++ 建立衍生類別。

使用 C++ 建立衍生類別

  1. 找出呼叫 IWbemServices::GetObject的基類。

    下列程式碼範例示範如何找出 Example 基類。

    // 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. 使用 IWbemClassObject::SpawnDerivedClass的呼叫,從基類建立衍生物件。

    下列程式碼範例示範如何建立衍生類別物件。

    pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass);
    pExampleClass->Release();  // Don't need the parent class any more
    
  3. 使用IWbemClassObject::P ut方法呼叫來設定__CLASS系統屬性,以建立 類別的名稱。

    下列程式碼範例示範如何將名稱指派給衍生類別。

    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. 使用 IWbemClassObject::P ut建立其他屬性。

    下列程式碼範例示範如何建立其他屬性。

    BSTR OtherProp = SysAllocString(L"OtherInfo2");
    pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); 
    SysFreeString(OtherProp);
    
  5. 呼叫 IWbemServices::P utClass來儲存新的類別。

    下列程式碼範例示範如何儲存新的衍生類別。

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

下列程式碼範例結合了上一個程式中討論的程式碼範例,說明如何使用 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();
}

下列程式描述如何使用 MOF 程式碼來定義衍生類別。

使用 MOF 程式碼定義衍生類別

  1. 使用 Class 關鍵字定義衍生類別,後面接著衍生類別的名稱,並以冒號分隔的父類別名稱。

    下列程式碼範例描述衍生類別的實作。

    class MyClass 
    {
        [key] string   strProp;
        sint32   dwProp1;
        uint32       dwProp2;
    };
    
    class MyDerivedClass : MyClass
    {
        string   strDerivedProp;
        sint32   dwDerivedProp;
    };
    
  2. 完成時,請使用 MOF 編譯器編譯 MOF 程式碼。

    如需詳細資訊,請參閱 編譯 MOF 檔案

建立類別