建立 WMI 衍生類別
在 WMI 中建立衍生類別與建立基類非常類似。 如同基類,您必須先定義衍生類別,然後使用 WMI 註冊衍生類別。 主要差異在於,您必須先找出要從中衍生的父類別。 如需詳細資訊,請參閱 撰寫類別提供者 和 撰寫實例提供者。
為提供者建立類別的建議方法是使用 Managed 物件格式 (MOF) 檔案。 與彼此相關的數個衍生類別應該分組為MOF檔案,以及它們從中衍生屬性或方法的任何基類。 如果您將每個類別放在個別的MOF檔案中,則必須先編譯每個檔案,提供者才能正常運作。
建立類別之後,您必須先刪除類別的所有實例,才能在衍生類別上執行下列任何活動:
注意
若要新增、移除或修改屬性或限定符,請呼叫 IWbemServices::P utClass 或 SWbemObject.Put_,並將旗標參數設定為 “force mode”。 只有在父類別為抽象時,才能使用 Abstract 限定符。
當您宣告衍生類別時,請觀察下列規則和限制:
衍生類別的父類別必須已經存在。
父類別的宣告可以出現在與衍生類別相同的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::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);
使用 IWbemClassObject:Put建立其他屬性。
下列程式代碼範例示範如何建立其他屬性。
BSTR OtherProp = SysAllocString(L"OtherInfo2"); pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); SysFreeString(OtherProp);
來儲存新類別,請呼叫 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程式代碼定義衍生類別
使用 Class 關鍵詞定義衍生類別,後面接著衍生類別的名稱,以及以冒號分隔的父類別名稱。
下列程式代碼範例說明衍生類別的實作。
class MyClass { [key] string strProp; sint32 dwProp1; uint32 dwProp2; }; class MyDerivedClass : MyClass { string strDerivedProp; sint32 dwDerivedProp; };
完成時,請使用MOF編譯程式編譯MOF程式代碼。
如需詳細資訊,請參閱 編譯MOF檔案。
相關主題