WMI 파생 클래스 만들기
WMI에서 파생 클래스를 만드는 것은 기본 클래스를 만드는 것과 매우 유사합니다. 기본 클래스와 마찬가지로 먼저 파생 클래스를 정의한 다음, 파생 클래스를 WMI에 등록해야 합니다. 주요 차이점은 먼저 파생하려는 부모 클래스를 찾아야 한다는 것입니다. 자세한 내용은 클래스 공급자 작성 및 인스턴스 공급자작성을 참조하세요.
공급자에 대한 클래스를 만드는 권장 방법은 MOF(Managed Object Format) 파일입니다. 서로 관련된 여러 파생 클래스는 속성 또는 메서드를 파생하는 기본 클래스와 함께 MOF 파일로 그룹화되어야 합니다. 각 클래스를 별도의 MOF 파일에 배치하는 경우 공급자가 제대로 작동하려면 먼저 각 파일을 컴파일해야 합니다.
클래스를 만든 후에는 클래스의 모든 인스턴스를 삭제해야 파생 클래스에서 다음 작업을 수행할 수 있습니다.
- 파생 클래스의 부모 클래스를 변경합니다.
- 속성을 추가하거나 제거합니다.
- 속성 유형을 변경합니다.
- 키 또는 인덱싱된 한정자를 추가하거나 제거합니다.
- Singleton, 동적또는 추상 한정자를 추가하거나 제거합니다.
메모
속성 또는 한정자를 추가, 제거 또는 수정하려면 IWbemServices::P utClass 또는 SWbemObject.Put_ 호출하고 플래그 매개 변수를 "강제 모드"로 설정합니다. Abstract 한정자는 부모 클래스가 추상인 경우에만 사용할 수 있습니다.
파생 클래스를 선언하는 경우 다음 규칙 및 제한을 준수합니다.
파생 클래스의 부모 클래스가 이미 있어야 합니다.
부모 클래스의 선언은 파생 클래스와 동일한 MOF 파일 또는 다른 파일에 나타날 수 있습니다. 부모 클래스를 알 수 없는 경우 컴파일러는 런타임 오류를 생성합니다.
파생 클래스에는 단일 부모 클래스만 있을 수 있습니다.
WMI는 여러 상속을 지원하지 않습니다. 그러나 부모 클래스에는 여러 파생 클래스가 있을 수 있습니다.
파생 클래스에 대한 인덱스를 정의할 수 있지만 WMI는 이러한 인덱스를 사용하지 않습니다.
따라서 파생 클래스에 인덱스를 지정해도 파생 클래스의 인스턴스에 대한 쿼리 성능이 향상되지는 않습니다. 파생 클래스의 부모 클래스에 대해 인덱싱된 속성을 지정하여 파생 클래스에서 쿼리의 성능을 향상시킬 수 있습니다.
파생 클래스 정의는 더 복잡할 수 있으며 별칭, 한정자 및 한정자 버전과 같은 기능을 포함할 수 있습니다.
한정자를 변경하거나 기본 클래스 속성의 기본값을 변경하거나 기본 클래스의 참조 또는 포함된 개체 속성을 보다 강력하게 입력하려면 전체 기본 클래스를 다시 선언해야 합니다.
WMI 클래스에서 정의할 수 있는 속성의 최대 수는 1024입니다.
메모
공급자를 실행하는 동안에는 클래스를 변경할 수 없습니다. 작업을 중지하고, 클래스를 변경한 다음, Windows 관리 서비스를 다시 시작해야 합니다. 현재 클래스 변경을 검색할 수 없습니다.
기본 클래스와 마찬가지로 이 기술의 가장 일반적인 용도는 클라이언트 애플리케이션입니다. 그러나 공급자는 파생 클래스를 만들 수도 있습니다. 자세한 내용은 기본 클래스 만들기 및 클래스 공급자 작성참조하세요.
이 항목의 코드 예제에서는 다음 #include 문을 올바르게 컴파일해야 합니다.
#include <wbemidl.h>
다음 절차에서는 C++를 사용하여 파생 클래스를 만드는 방법을 설명합니다.
C++ 사용하여 파생 클래스를 만들려면
IWbemServices::GetObject호출하여 기본 클래스를 찾습니다.
다음 코드 예제에서는 예제 기본 클래스를 찾는 방법을 보여줍니다.
// 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 MyClass { [key] string strProp; sint32 dwProp1; uint32 dwProp2; }; class MyDerivedClass : MyClass { string strDerivedProp; sint32 dwDerivedProp; };
완료되면 MOF 컴파일러를 사용하여 MOF 코드를 컴파일합니다.
자세한 내용은 MOF 파일을 컴파일하는 방법을참조하세요.
관련 항목