WMI 메서드 만들기

WMI 메서드를 만들려면 메서드의 입출력 매개 변수를 정의합니다. 입출력 매개 변수는 특수 WMI 시스템 클래스 __PARAMETERS로 표시됩니다. 자세한 내용은 메서드 호출메서드 공급자 작성을 참조하세요.

이 항목에서는 다음 섹션에 대해 설명합니다.

MOF에서 WMI 클래스 메서드 만들기

WMI에서 공급자 메서드는 일반적으로 클래스가 나타내는 개체와 관련된 별개의 작업입니다. 작업을 실행하기 위해 속성 값을 변경하는 것이 아니라 메서드를 만들어야 합니다. 예를 들어, EnableDisable 메서드를 사용하여 Win32_NetworkAdapter로 표시되는 NIC(네트워크 정보 센터)를 사용 또는 사용하지 않도록 설정할 수 있습니다. 이러한 작업은 읽기/쓰기 속성으로 나타낼 수 있지만 권장되는 디자인은 메서드를 만드는 것입니다. 또는 클래스에 대해 상태나 값을 표시하려는 경우 메서드 대신 읽기/쓰기 속성을 만드는 것이 좋습니다. Win32_NetworkAdapter에서 NetEnabled 속성은 어댑터의 상태를 표시하지만 상태 간 변경은 Enable 또는 Disable 메서드에 의해 실행됩니다.

클래스 선언에는 하나 이상의 메서드 선언이 포함될 수 있습니다. 부모 클래스의 메서드를 상속하거나 직접 구현하도록 선택할 수 있습니다. 고유한 메서드를 구현하기로 선택한 경우 메서드를 선언하고 특정 한정자 태그로 메서드를 표시해야 합니다.

다음 절차에서는 기본 클래스에서 상속하지 않는 클래스에서 메서드를 선언하는 방법을 설명합니다.

메서드를 선언하려면

  1. 클래스 선언의 중괄호와 한정자 사이에 메서드 이름을 정의합니다.

    다음 코드 예에서는 메서드의 구문을 설명합니다.

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. 완료되면 MOF(Managed Object Format) 코드를 MOF 컴파일러를 호출하여 WMI 리포지토리에 삽입합니다.

    자세한 내용은 MOF 파일 컴파일을 참조하세요.

다음 목록은 메서드 선언의 요소를 정의합니다.

공급자

특정 공급자를 클래스 설명에 연결합니다. Provider 한정자의 값은 메서드를 지원하는 코드가 있는 위치를 WMI에 알려 주는 공급자의 이름입니다. 또한 공급자는 동적 인스턴스가 있는 모든 클래스를 Dynamic 한정자로 표시해야 합니다. 반대로 Dynamic 한정자를 사용하여 Implemented 메서드가 있는 정적 인스턴스를 포함하는 클래스를 표시하지 마세요.

Implemented

부모 클래스에서 메서드 구현을 상속하지 않고 메서드를 구현하겠다고 선언합니다. 기본적으로 WMI는 파생 클래스에서 구현을 제공하지 않는 한 부모 클래스의 구현을 파생 클래스로 전파합니다. Implemented 한정자를 생략하면 메서드가 해당 클래스에 구현되지 않았음을 나타냅니다. Implemented 한정자 없이 메서드를 다시 선언하면 WMI는 여전히 해당 메서드를 구현하지 않을 것이라고 가정하고 호출 시 부모 클래스 메서드 구현을 호출합니다. 따라서 Implemented 한정자를 첨부하지 않고 파생 클래스에서 메서드를 다시 선언하는 것은 한정자를 메서드에 추가하거나 메서드에서 제거할 때만 유용합니다.

ReturnType

메서드가 반환하는 값을 설명합니다. 메서드의 반환 값은 부울, 숫자, CHAR, STRING, DATETIME 또는 스키마 개체여야 합니다. 메서드가 아무 것도 반환하지 않음을 나타내는 VOID로 반환 형식을 선언할 수도 있습니다. 그러나 배열을 반환 값 형식으로 선언할 수는 없습니다.

MethodName

메서드의 이름을 정의합니다. 모든 메서드에는 고유한 이름이 있어야 합니다. WMI는 이름이 같고 시그니처가 다른 두 개의 메서드가 한 클래스 또는 클래스 계층 구조 내에 존재할 수 없습니다. 따라서 메서드를 오버로드할 수도 없습니다.

ParameterDirection

매개 변수가 입력 매개 변수인지, 출력 매개 변수인지 또는 둘 다인지 설명하는 한정자를 포함합니다. 동일한 매개 변수 이름을 입력 매개 변수로 두 번 이상 사용하거나 출력 매개 변수로 두 번 이상 사용하지 마세요. 동일한 매개 변수 이름이 InOut 한정자와 함께 표시되는 경우 기능은 단일 매개 변수에서 In, Out 한정자를 사용하는 것과 개념적으로 동일합니다. 그러나 별도의 선언을 사용하는 경우 입출력 매개 변수는 ID 한정자의 수와 형식을 포함하여 다른 모든 측면에서 정확히 동일해야 하며 한정자는 동일해야 합니다. 두 가지 모두에 대해 명시적으로 선언했습니다. 단일 매개 변수 선언 내에서 In, Out 한정자를 사용하는 것이 좋습니다.

IDQualifier

메서드의 매개 변수 시퀀스 내에서 각 매개 변수의 위치를 고유하게 식별하는 ID 한정자를 포함합니다. 기본적으로 MOF 컴파일러는 ID 한정자로 매개 변수를 자동으로 표시합니다. 컴파일러는 첫 번째 매개 변수 값을 0(영)으로 표시하고 두 번째 매개 변수 값을 1(일)로 표시합니다. 필요한 경우 MOF 코드에서 ID 시퀀스를 명시적으로 지정할 수 있습니다.

ParameterType

메서드가 허용할 수 있는 데이터 형식을 설명합니다. 배열, 스키마 개체 또는 참조를 포함하여 모든 MOF 데이터 값으로 매개 변수 형식을 정의할 수 있습니다. 배열을 매개 변수로 사용하는 경우 배열을 언바운드로 사용하거나 명시적인 크기로 사용합니다.

ParameterName

매개 변수의 이름을 포함합니다. 이 시점에서 매개 변수의 기본값을 정의하도록 선택할 수도 있습니다. 초기 값이 없는 매개 변수는 할당되지 않은 상태로 유지됩니다.

다음 코드 예에서는 매개 변수 목록과 한정자를 설명합니다.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] sint32 InParam);
    [Implemented] 
    void MyMethod2 ([in, id(0)] sint32 InParam, 
       [out, id(1)] sint32 OutParam);
    [Implemented] 
    sint32 MyMethod3 ([in, out, id(0)] sint32 InOutParam);
};

다음 코드 예에서는 MOF 매개 변수에서 배열을 사용하는 방법을 설명합니다.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk DiskParam[]);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] Win32_LogicalDisk DiskParam[32]);
};

다음 코드 예에서는 스키마 개체를 매개 변수 및 반환 값으로 사용하는 방법을 설명합니다.

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk 
        DiskParam);
    [Implemented] 
    Win32_LogicalDisk MyMethod2 ([in, id(0)] string DiskVolLabel);
};

다음 코드 예는 Win32_LogicalDisk 클래스의 인스턴스에 대한 참조와 알 수 없는 개체 형식의 인스턴스에 대한 참조를 포함하는 방법을 설명합니다.

[Dynamic, Provider("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk ref DiskRef);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] object ref AnyObject);
};

C++에서 WMI 클래스 메서드 만들기

다음 프로시저에서는 프로그래밍 방식으로 WMI 클래스 메서드를 만드는 방법을 설명합니다.

WMI 클래스 메서드를 프로그래밍 방식으로 만들려면

  1. 메서드가 속할 클래스를 만듭니다.

    메서드를 만들기 전에 먼저 메서드를 배치할 클래스가 있어야 합니다.

  2. IWbemServices::GetObject 또는 GetObjectAsync를 사용하여 __PARAMETERS 시스템 클래스의 두 자식 클래스를 검색합니다.

    첫 번째 자식 클래스를 사용하여 내부 매개 변수를 설명하고 두 번째 자식 클래스를 사용하여 외부 매개 변수를 설명합니다. 필요한 경우 단일 검색을 수행한 후 IWbemClassObject::Clone 메서드를 호출할 수 있습니다.

  3. IWbemClassObject::Put에 대한 하나 이상의 호출을 사용하여 in 매개 변수를 첫 번째 클래스에 쓰고 out 매개 변수를 두 번째 클래스에 씁니다.

    메서드에 대한 매개 변수를 설명할 때 다음 규칙 및 제한 사항을 준수합니다.

    • [in, out] 매개 변수를 개별 항목으로 처리합니다. 하나는 입력 매개 변수가 포함된 개체에 있고 다른 하나는 출력 매개 변수가 포함된 개체에 있습니다.

    • [in, out] 한정자를 제외하고 나머지 한정자는 정확히 동일해야 합니다.

    • 0부터 시작하여 각 매개 변수에 대해 하나씩 ID 한정자를 지정합니다.

      입력 또는 출력 매개 변수의 순서는 각 매개 변수의 ID 한정자 값으로 설정됩니다. 모든 입력 인수는 출력 인수 앞에 와야 합니다. 기존 메서드 공급자를 업데이트할 때 메서드 입출력 매개 변수의 순서를 변경하면 메서드를 호출하는 애플리케이션이 실패할 수 있습니다. 이미 설정된 시퀀스에 삽입하는 대신 기존 매개 변수의 끝에 새 입력 매개 변수를 추가합니다.

      ID 한정자 시퀀스에 간격이 없어야 합니다.

    • 반환 값을 ReturnValue라는 속성으로 out 매개 변수 클래스에 배치합니다.

      이는 속성을 메서드의 반환 값으로 식별합니다. 이 특성의 CIM 형식은 메서드의 반환 형식입니다. 메서드의 반환 형식이 void이면 ReturnValue 속성이 전혀 없습니다. 또한 ReturnValue 속성은 메서드의 인수와 같은 ID 한정자를 가질 수 없습니다. ReturnValue 속성에 ID 한정자를 할당하면 WMI 오류가 발생합니다.

    • 클래스의 속성에 대한 기본 매개 변수 값을 표현합니다.

  4. IWbemClassObject::PutMethod를 호출하여 두 __PARAMETERS 개체를 부모 클래스에 배치합니다.

    PutMethod를 한 번 호출하면 두 __PARAMETERS 개체를 클래스에 배치할 수 있습니다.

클래스 만들기