다음을 통해 공유


WMI 파생 클래스 만들기

WMI에서 파생 클래스를 만드는 작업은 기본 클래스를 만드는 작업과 매우 유사합니다. 기본 클래스에서처럼 먼저 파생 클래스를 정의한 다음 파생 클래스를 WMI에 등록해야 합니다. 가장 큰 차이점은 파생해 올 부모 클래스를 먼저 찾아야 한다는 것입니다. 자세한 내용은 클래스 공급자 작성인스턴스 공급자 작성을 참조하세요.

공급자에 대한 클래스를 만드는 권장되는 방법은 MOF(Managed Object Format) 파일입니다. 서로 관련된 여러 파생 클래스는 자신이 속성 또는 메서드를 파생하는 기본 클래스와 함께 MOF 파일로 그룹화되어야 합니다. 각 클래스를 별도의 MOF 파일에 배치하는 경우, 공급자가 제대로 작동하려면 먼저 각 파일을 컴파일해야 합니다.

클래스를 만든 후에는 클래스의 모든 인스턴스를 삭제해야 파생 클래스에서 다음 작업을 수행할 수 있습니다.

  • 파생 클래스의 부모 클래스를 변경합니다.
  • 속성을 추가하거나 제거합니다.
  • 속성 형식을 변경합니다.
  • Key 또는 Indexed 한정자를 추가하거나 제거합니다.
  • Singleton, Dynamic 또는 Abstract 한정자를 추가하거나 제거합니다.

참고

속성이나 한정자를 추가, 제거 또는 수정하려면 IWbemServices::PutClass 또는 SWbemObject.Put_을 호출하고 플래그 매개 변수를 "강제 모드"로 설정합니다. Abstract 한정자는 부모 클래스가 추상인 경우에만 사용할 수 있습니다.

 

파생 클래스를 선언할 때는 다음 규칙 및 제한을 준수해야 합니다.

  • 파생 클래스의 부모 클래스가 이미 있어야 합니다.

    부모 클래스의 선언은 파생 클래스와 동일한 MOF 파일에 나타나거나 다른 파일에 나타날 수 있습니다. 부모 클래스를 알 수 없는 경우 컴파일러는 런타임 오류를 생성합니다.

  • 파생 클래스에는 단일 부모 클래스만 존재할 수 있습니다.

    WMI에서는 다중 상속성이 지원되지 않습니다. 그러나 부모 클래스에는 여러 파생 클래스가 존재할 수 있습니다.

  • 파생 클래스에 대한 인덱스를 정의할 수 있지만, WMI에서는 이러한 인덱스를 사용하지 않습니다.

    따라서 파생 클래스에 인덱스를 지정해도 파생 클래스의 인스턴스에 대한 쿼리 성능이 향상되지 않습니다. 파생 클래스의 부모 클래스에 대해 인덱싱된 속성을 지정하면 파생 클래스 쿼리의 성능을 개선할 수 있습니다.

  • 파생 클래스 정의는 더 복잡할 수 있으며 별칭, 한정자 및 한정자 버전 같은 기능을 포함할 수 있습니다.

    자세한 내용은 별칭 만들기한정자 추가를 참조하세요.

  • 한정자를 변경하거나, 기본 클래스 속성의 기본값을 변경하거나, 기본 클래스의 참조 또는 포함된 개체 속성을 보다 강력하게 입력하고 싶다면, 전체 기본 클래스를 다시 선언해야 합니다.

  • WMI 클래스에서는 속성을 1024개까지 정의할 수 있습니다.

참고

공급자를 실행하는 동안에는 클래스를 변경할 수 없습니다. 작업을 중지하고 클래스를 변경한 다음 Windows Management 서비스를 다시 시작해야 합니다. 현재는 클래스 변경을 검색할 수 없습니다.

 

기본 클래스처럼 이 기술의 가장 일반적인 용도는 클라이언트 애플리케이션입니다. 그러나 공급자는 파생 클래스를 만들 수도 있습니다. 자세한 내용은 기본 클래스 만들기클래스 공급자 작성을 참조하세요.

이 항목의 코드 예제에서는 다음 #include 문을 올바르게 컴파일해야 합니다.

#include <wbemidl.h>

다음 절차에서는 C++를 사용하여 파생 클래스를 만드는 방법을 설명합니다.

C++를 사용하여 파생 클래스를 만드는 방법

  1. 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);
    
  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 파일 컴파일을 참조하세요.

클래스 만들기