建立 WMI 衍生類別
在 WMI 中建立衍生類別非常類似于建立基類。 如同基類,您必須先定義衍生類別,然後使用 WMI 註冊衍生類別。 主要差異在於,您必須先找出要從中衍生的父類別。 如需詳細資訊,請參閱 撰寫類別提供者 和 寫入執行個體提供者。
為提供者建立類別的建議方法是使用 Managed 物件格式 (MOF) 檔案。 與彼此相關的數個衍生類別應該分組成 MOF 檔案,以及衍生屬性或方法的任何基類。 如果您將每個類別放在個別的 MOF 檔案中,則必須編譯每個檔案,提供者才能正常運作。
建立類別之後,您必須先刪除類別的所有實例,才能在衍生類別上執行下列任何活動:
- 變更衍生類別的父類別。
- 新增或移除屬性。
- 變更屬性類型。
- 新增或移除 索引鍵 或 索引 限定詞。
- 新增或移除 Singleton、 Dynamic或 Abstract 限定 符。
注意
若要新增、移除或修改屬性或限定詞,請呼叫 IWbemServices::P utClass 或 SWbemObject.Put_ ,並將旗標參數設定為 「force mode」。 只有在父類別是 抽象時 ,才能使用抽象限定詞。
當您宣告衍生類別時,請觀察下列規則和限制:
衍生類別的父類別必須已經存在。
父類別的宣告可以出現在與衍生類別相同的 MOF 檔案中,或出現在不同的檔案中。 如果父類別未知,編譯器會產生執行階段錯誤。
衍生類別只能有單一父類別。
WMI 不支援多重繼承。 不過,父類別可以有許多衍生類別。
您可以定義衍生類別的索引,但 WMI 不會使用這些索引。
因此,在衍生類別上指定索引並不會改善衍生類別實例之查詢的效能。 您可以為衍生類別的父類別指定索引屬性,以改善衍生類別的查詢效能。
衍生類別定義可能更為複雜,而且可以包含別名、限定詞和限定詞類別等功能。
如果您想要變更限定詞,請變更基類屬性的預設值,或更強式地輸入基類的參考或内嵌物件屬性,您必須再次宣告整個基類。
您可以在 WMI 類別中定義的屬性數目上限為 1024。
注意
類別在執行提供者期間無法變更。 您必須停止活動、變更 類別,然後重新開機 Windows 管理服務。 目前無法偵測類別變更。
和基類一樣,用戶端應用程式最常使用這項技術。 不過,提供者也可以建立衍生類別。 如需詳細資訊,請參閱 建立基類 和 撰寫類別提供者。
本主題中的程式碼範例需要下列#include語句才能正確編譯。
#include <wbemidl.h>
下列程式描述如何使用 C++ 建立衍生類別。
使用 C++ 建立衍生類別
找出呼叫 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);
使用 IWbemClassObject::SpawnDerivedClass的呼叫,從基類建立衍生物件。
下列程式碼範例示範如何建立衍生類別物件。
pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass); pExampleClass->Release(); // Don't need the parent class any more
使用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);
使用 IWbemClassObject::P ut建立其他屬性。
下列程式碼範例示範如何建立其他屬性。
BSTR OtherProp = SysAllocString(L"OtherInfo2"); pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); SysFreeString(OtherProp);
呼叫 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 程式碼定義衍生類別
使用 Class 關鍵字定義衍生類別,後面接著衍生類別的名稱,並以冒號分隔的父類別名稱。
下列程式碼範例描述衍生類別的實作。
class MyClass { [key] string strProp; sint32 dwProp1; uint32 dwProp2; }; class MyDerivedClass : MyClass { string strDerivedProp; sint32 dwDerivedProp; };
完成時,請使用 MOF 編譯器編譯 MOF 程式碼。
如需詳細資訊,請參閱 編譯 MOF 檔案。
相關主題