共用方式為


建立 WMI 衍生類別

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

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

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

  • 變更衍生類別的父類別。
  • 新增或移除屬性。
  • 變更屬性類型。
  • 新增或移除 鍵、索引 的限定符。
  • 新增或移除 單例動態抽象 限定符。

注意

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

 

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

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

    父類別的宣告可以出現在與衍生類別相同的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::Put 方法來設定 __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:Put建立其他屬性。

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

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

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

    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檔案

建立類別