Bir WMI Türetilmiş Sınıf Oluşturmak
WMI'de türetilmiş bir sınıf oluşturmak, temel sınıf oluşturmaya çok benzer. Temel sınıfta olduğu gibi, önce türetilmiş sınıfı tanımlamanız ve ardından türetilmiş sınıfı WMI'ye kaydetmeniz gerekir. Temel fark, önce türetmek istediğiniz üst sınıfı bulmanız gerektiğidir. Daha fazla bilgi için bkz. Sınıf Sağlayıcısı Yazma ve Örnek Sağlayıcısı Yazma.
Bir sağlayıcı için sınıf oluşturmanın önerilen yolu Yönetilen Nesne Biçimi (MOF) dosyalarındadır. Birbiriyle ilişkili çeşitli türetilmiş sınıflar, özellikleri veya yöntemleri türetdikleri temel sınıflarla birlikte bir MOF dosyasında gruplandırılmalıdır. Her sınıfı ayrı bir MOF dosyasına yerleştirirseniz sağlayıcının düzgün çalışabilmesi için her dosyanın derlenmiş olması gerekir.
Sınıfınızı oluşturduktan sonra, türetilmiş sınıfınızda aşağıdaki etkinliklerden herhangi birini gerçekleştirebilmeniz için önce sınıfınızın tüm örneklerini silmeniz gerekir:
- Türetilmiş sınıfınızın üst sınıfını değiştirin.
- Özellikleri ekleyin veya kaldırın.
- Özellik türlerini değiştirme.
- Anahtar veya Dizinli niteleyicilerini ekleyin veya kaldırın.
- Singleton, Dinamikveya Soyutniteleyicileriniekleyin veya kaldırın.
Not
Özellik veya niteleyici eklemek, kaldırmak veya değiştirmek için IWbemServices::P utClassveya SWbemObject.Put_çağırın ve bayrak parametresini "zorla modu" olarak ayarlayın. Soyut niteleyicisi yalnızca üst sınıf soyut olduğunda kullanılabilir.
Türetilmiş sınıfınızı bildirdiğinizde aşağıdaki kuralları ve kısıtlamaları gözlemleyin:
Türetilmiş sınıfın üst sınıfı zaten mevcut olmalıdır.
Üst sınıfın bildirimi, türetilmiş sınıfla aynı MOF dosyasında veya farklı bir dosyada görüntülenebilir. Üst sınıf bilinmiyorsa, derleyici bir çalışma zamanı hatası oluşturur.
Türetilmiş bir sınıf yalnızca tek bir üst sınıfa sahip olabilir.
WMI birden çok devralmayı desteklemez. Ancak bir üst sınıfın birçok türetilmiş sınıfı olabilir.
Türetilmiş sınıflar için dizinler tanımlayabilirsiniz, ancak WMI bu dizinleri kullanmaz.
Bu nedenle, türetilmiş bir sınıfta dizin belirtmek, türetilmiş sınıfın örnekleri için sorguların performansını iyileştirmez. Türetilmiş sınıfın üst sınıfı için dizine alınmış özellikler belirterek türetilmiş bir sınıftaki sorgunun performansını geliştirebilirsiniz.
Türetilmiş sınıf tanımları daha karmaşık olabilir ve diğer adlar, niteleyiciler ve nitelik türleri gibi özellikleri içerebilir.
Daha fazla bilgi için bkz. Diğer Ad Oluşturma ve Niteleyici Ekleme.
Bir niteleyiciyi değiştirmek, bir temel sınıf özelliğinin varsayılan değerini değiştirmek veya bir temel sınıfın başvuru veya katıştırılmış nesne özelliğini daha güçlü bir şekilde yazmak istiyorsanız, temel sınıfın tamamını yeniden bildirmeniz gerekir.
WMI sınıfında tanımlayabileceğiniz en fazla özellik sayısı 1024'tür.
Not
Sınıflar, sağlayıcıların yürütülmesi sırasında değiştirilemez. Etkinliği durdurmanız, sınıfını değiştirmeniz ve ardından Windows Yönetim hizmetini yeniden başlatmanız gerekir. Bir sınıf değişikliğini algılamak şu anda mümkün değildir.
Temel sınıfta olduğu gibi, bu tekniğin en yaygın kullanımı istemci uygulamaları tarafından kullanılır. Ancak, bir sağlayıcı türetilmiş bir sınıf da oluşturabilir. Daha fazla bilgi için bkz. Temel Sınıf Oluşturma ve Sınıf Sağlayıcısı Yazma.
Bu konudaki kod örneğinin doğru şekilde derlenmesi için aşağıdaki #include deyimi gereklidir.
#include <wbemidl.h>
Aşağıdaki yordamda, C++ kullanarak türetilmiş bir sınıfın nasıl oluşturulacağı açıklanmaktadır.
C++ kullanarak türetilmiş sınıf oluşturmak için
IWbemServices::GetObjectçağrısıyla temel sınıfı bulun.
Aşağıdaki kod örneğinde Örnek temel sınıfının nasıl bulunu olduğu gösterilmektedir.
// 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çağrısıyla temel sınıftan türetilmiş bir nesne oluşturun.
Aşağıdaki kod örneğinde türetilmiş bir sınıf nesnesinin nasıl oluşturulacağı gösterilmektedir.
pExampleClass->SpawnDerivedClass(0, &pNewDerivedClass); pExampleClass->Release(); // Don't need the parent class any more
__CLASS sistem özelliğini IWbemClassObject::Put yöntemine bir çağrıyla ayarlayarak sınıf için bir ad oluşturun.
Aşağıdaki kod örneğinde türetilmiş sınıfa bir ad atama gösterilmektedir.
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::Putile ek özellikler oluşturun.
Aşağıdaki kod örneğinde ek özelliklerin nasıl oluşturulacağı gösterilmektedir.
BSTR OtherProp = SysAllocString(L"OtherInfo2"); pNewDerivedClass->Put(OtherProp, 0, NULL, CIM_STRING); SysFreeString(OtherProp);
IWbemServices::PutClassçağırarak yeni sınıfı kaydedin.
Aşağıdaki kod örneğinde yeni türetilmiş sınıfın nasıl kaydedilecekleri gösterilmektedir.
hRes = pSvc->PutClass(pNewDerivedClass, 0, pCtx, &pResult); pNewDerivedClass->Release();
Aşağıdaki kod örneği, WMI API'sini kullanarak türetilmiş bir sınıfın nasıl oluşturulacağını açıklamak için önceki yordamda açıklanan kod örneklerini birleştirir.
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();
}
Aşağıdaki yordamda MOF kodu kullanılarak türetilmiş bir sınıfın nasıl tanımlanacağı açıklanmaktadır.
MOF kodu kullanarak türetilmiş bir sınıf tanımlamak için
türetilmiş sınıfınızı Class anahtar sözcüğüyle, ardından türetilmiş sınıfınızın adıyla ve üst sınıfın iki nokta üst üste ile ayrılmış adıyla tanımlayın.
Aşağıdaki kod örneği, türetilmiş bir sınıfın uygulamasını açıklar.
class MyClass { [key] string strProp; sint32 dwProp1; uint32 dwProp2; }; class MyDerivedClass : MyClass { string strDerivedProp; sint32 dwDerivedProp; };
Tamamlandığında, MOF kodunuzu MOF derleyicisi ile derleyin.
İlgili konular