다음을 통해 공유


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::P ut 메서드를 호출하여 클래스에 정의된 값을 상속하지 않는 속성의 값을 설정합니다.

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

    기존 클래스에 키 속성이 있는 경우 속성을 NULL로 설정하거나 보장된 고유 값으로 설정해야 합니다. 키를 NULL 설정하고 키가 문자열인 경우 PutInstanceAsync또는 PutInstance내부적으로 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 경우 클래스에 대해 정의된 한정자의 다른 값을 지정할 수 있습니다. flavor가 DisableOverride로 설정된 클래스 한정자를 수정하거나 삭제할 수 없습니다. 자세한 내용은 한정자 버전참조하세요.

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

  5. IWbemServices::P utInstance 또는 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를 통해 다음 작업을 수행할 수 없습니다.

  • 인스턴스가 속한 클래스의 부모 클래스를 변경합니다.
  • 속성을 추가하거나 제거합니다.
  • 속성 유형을 변경합니다.
  • 또는 인덱싱된 한정자를 추가하거나 제거합니다.
  • Singleton, 동적또는 추상 한정자를 추가하거나 제거합니다.

다음 코드 예제에서는 이전 절차에서 설명한 코드 예제를 결합하여 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();
}