C++를 사용하여 인스턴스 만들기 및 선언

IWbemServices 인터페이스를 통해 C++에서 인스턴스를 만들 수 있습니다.

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

#include <wbemidl.h>

다음 절차에서는 기존 클래스의 인스턴스를 만드는 방법을 설명합니다.

기존 클래스의 인스턴스를 만드는 방법

  1. IWbemServices::GetObject 또는 IWbemServices::GetObjectAsync 메서드를 호출하여 기존 클래스의 정의를 검색합니다.

    다음 코드 예제에서는 GetObjectGetObjectAsync 메서드를 사용하여, 클래스 정의에 대한 액세스를 제공하는 IWbemClassObject 인터페이스에 대한 포인터를 가져오는 방법을 확인할 수 있습니다.

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewInstance = 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::SpawnInstance 메서드를 호출하여 새 인스턴스를 만듭니다.

    다음 코드 예제에서는 새 인스턴스를 만든 다음 클래스를 해제하는 방법을 확인할 수 있습니다.

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. IWbemClassObject::Put 메서드를 호출하여, 클래스에 정의된 값을 상속하지 않는 속성의 값을 설정합니다.

    클래스의 각 인스턴스는 클래스에 대해 정의된 모든 속성을 상속합니다. 그러나 원한다면 다른 속성 값을 지정할 수 있습니다.

    기존 클래스에 키 속성이 있는 경우 속성을 NULL 또는 보장된 고유 값으로 설정해야 합니다. 키를 NULL 로 설정하고 키가 문자열인 경우, PutInstanceAsync 또는 PutInstance는 내부적으로 GUID를 생성하고 키에 GUID를 할당합니다. 이런 식으로 키 속성에 NULL을 지정하면 이전 인스턴스를 덮어쓰지 않는 고유한 인스턴스를 만들 수 있습니다.

    다음 코드 예제에서는 예제 인스턴스 클래스의 Index 속성 값을 설정하는 방법을 확인할 수 있습니다.

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");
    
    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);
    
  4. IWbemClassObject::GetQualifierSet 호출을 통해 관련 한정자의 값을 설정합니다.

    GetQualifierSet 메서드는 클래스 또는 인스턴스의 한정자에 액세스하는 데 사용하는 IWbemQualifierSet 인터페이스에 대한 포인터를 반환합니다. 클래스 한정자 특성이 EnableOverride인 경우 클래스에 대해 정의된 한정자의 다른 값을 지정할 수 있습니다. 특성이 DisableOverride로 설정된 클래스 한정자는 수정하거나 삭제할 수 없습니다. 자세한 내용은 한정자 특성을 참조하세요.

    선택 사항으로, 인스턴스 클래스에 대한 추가 한정자를 정의할 수도 있습니다. 클래스 선언에 표시할 필요가 없는 인스턴스 또는 인스턴스 속성에 대한 추가 한정자를 정의할 수 있습니다.

  5. IWbemServices::PutInstance 또는 IWbemServices::P utInstanceAsync 메서드를 호출하여 인스턴스를 저장합니다.

    WMI는 인스턴스를 현재 WMI 네임스페이스에 저장합니다. 따라서 인스턴스의 전체 경로는 대부분의 경우 root\default인 네임스페이스에 따라 달라집니다. 이 코드 예제의 경우 전체 경로 이름은 \\.\root\default:Example.Index="IX100"입니다.

    다음 코드 예제에서는 인스턴스를 저장하는 방법을 확인할 수 있습니다.

        hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
        pNewInstance->Release();
    

WMI에 인스턴스를 저장하면 인스턴스의 여러 속성이 잠기게 됩니다.

특히 WMI 인프라 내에 인스턴스가 있으면, WMI API를 통해 다음 작업을 수행할 수 없게 됩니다.

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

다음 코드 예제에서는 이전 절차에서 설명한 코드 예제를 결합하여 WMI API를 이용해 기본 클래스를 만드는 방법을 확인할 수 있습니다.

void CreateInstance (IWbemServices *pSvc)
{
    IWbemClassObject *pNewInstance = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;

    // Get the class definition.
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                 &pExampleClass, &pResult);
    SysFreeString(PathToClass);

    if (hRes != 0)
       return;

    // Create a new instance.
    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more

    VARIANT v;
    VariantInit(&v);

    // Set the Index property (the key).
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");

    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);

    // Set the IntVal property.
    V_VT(&v) = VT_I4;
    V_I4(&v) = 1001;  
    
    BSTR Prop = SysAllocString(L"IntVal");
    pNewInstance->Put(Prop, 0, &v, 0);
    SysFreeString(Prop);
    VariantClear(&v);    
    
    // Other properties acquire the 'default' value specified
    // in the class definition unless otherwise modified here.

    // Write the instance to WMI. 
    hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
    pNewInstance->Release();
}