다음을 통해 공유


IWbemObjectSink 인터페이스

IWbemObjectSink 인터페이스는 WMI 프로그래밍 모델 내의 모든 유형의 알림을 수신할 수 있는 싱크 인터페이스를 만듭니다. 클라이언트가 IWbemServices비동기 메서드 결과와 특정 유형의 이벤트 알림을 수신하려면 이 인터페이스를 구현해야 합니다. 공급자는 이 인터페이스를 사용하지만 WMI에 이벤트 및 개체를 제공하기 위해 이 인터페이스를 구현하지는 않습니다.

공급자는 일반적으로 WMI에 의해 제공된 구현을 호출합니다. 이 경우 Indicate를 호출하여 WMI 서비스에 개체를 제공합니다. 그런 다음 SetStatus를 호출하여 알림 시퀀스의 끝을 나타냅니다. 싱크에 개체가 없는 경우 SetStatus를 호출하여 오류를 나타낼 수도 있습니다.

WMI의 비동기 클라이언트를 프로그래밍할 때는 사용자가 구현을 제공합니다. WMI는 메서드를 호출하여 개체를 전달하고 결과의 상태를 설정합니다.

참고

클라이언트 애플리케이션이 두 개의 겹치는 비동기 호출에서 동일한 싱크 인터페이스를 전달하는 경우 WMI는 콜백의 순서를 보장하지 않습니다. 겹치는 비동기 호출을 수행한 클라이언트 애플리케이션이 서로 다른 싱크 개체를 전달하거나 호출을 직렬화해야 합니다.

참고

싱크에 대한 콜백은 클라이언트에서 요구하는 것과 동일한 인증 수준으로 반환되지 않을 수 있으므로 비동기 통신 대신 반동기 통신을 사용하는 것이 좋습니다. 자세한 내용은 메서드 호출을 참조하세요.

멤버

IWbemObjectSink 인터페이스에는 다음과 같은 유형의 멤버가 있습니다.

메서드

IWbemObjectSink 인터페이스에는 다음과 같은 메서드가 있습니다.

메서드 설명
Indicate 알림 개체를 수신합니다.
SetStatus 알림 시퀀스의 끝을 나타내거나 싱크에 다른 상태 코드를 보내기 위해 원본에 의해 호출됩니다.

설명

이벤트 구독 싱크(IWbemObjectSink 또는 IWbemEventSink)를 구현할 때는 싱크 개체의 Indicate 또는 SetStatus 메서드 내에서 WMI를 호출하면 안 됩니다. 예를 들어, 싱크를 취소하기 위해 Indicate의 구현 내에서 IWbemServices::CancelAsyncCall을 호출하면 WMI 상태를 방해할 수 있습니다. 이벤트 구독을 취소하려면 플래그를 설정하고 다른 스레드 또는 개체에서 IWbemServices::CancelAsyncCall을 호출합니다. 개체, 열거형, 쿼리 검색과 같이 이벤트 싱크와 관련이 없는 구현의 경우 WMI를 호출할 수 있습니다.

이벤트 알림을 전달하는 WMI 스레드는 싱크 개체의 처리가 완료될 때까지 다른 작업을 수행할 수 없으므로 싱크 구현은 이벤트 알림을 100밀리초 내에 처리해야 합니다. 알림에 대량 처리가 필요한 경우 싱크는 다른 스레드가 처리를 진행하도록 내부 큐를 사용할 수 있습니다.

예제

다음 코드 예제는 개체 싱크의 간단한 구현입니다. 이 샘플은 IWbemServices::ExecQueryAsync 또는 IWbemServices::CreateInstanceEnumAsync와 함께 사용하여 반환된 인스턴스를 수신할 수 있습니다.

#include <iostream>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

class QuerySink : public IWbemObjectSink
{
    LONG m_lRef;
    bool bDone; 

public:
    QuerySink() { m_lRef = 0; }
   ~QuerySink() { bDone = TRUE; }

    virtual ULONG STDMETHODCALLTYPE AddRef();
    virtual ULONG STDMETHODCALLTYPE Release();        
    virtual HRESULT STDMETHODCALLTYPE 
        QueryInterface(REFIID riid, void** ppv);

    virtual HRESULT STDMETHODCALLTYPE Indicate( 
            /* [in] */
            LONG lObjectCount,
            /* [size_is][in] */
            IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray
            );
        
    virtual HRESULT STDMETHODCALLTYPE SetStatus( 
            /* [in] */ LONG lFlags,
            /* [in] */ HRESULT hResult,
            /* [in] */ BSTR strParam,
            /* [in] */ IWbemClassObject __RPC_FAR *pObjParam
            );
};


ULONG QuerySink::AddRef()
{
    return InterlockedIncrement(&m_lRef);
}

ULONG QuerySink::Release()
{
    LONG lRef = InterlockedDecrement(&m_lRef);
    if(lRef == 0)
        delete this;
    return lRef;
}

HRESULT QuerySink::QueryInterface(REFIID riid, void** ppv)
{
    if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
    {
        *ppv = (IWbemObjectSink *) this;
        AddRef();
        return WBEM_S_NO_ERROR;
    }
    else return E_NOINTERFACE;
}


HRESULT QuerySink::Indicate(long lObjCount, IWbemClassObject **pArray)
{
    for (long i = 0; i < lObjCount; i++)
    {
        IWbemClassObject *pObj = pArray[i];

        // ... use the object.

        // AddRef() is only required if the object will be held after
        // the return to the caller.
    }

    return WBEM_S_NO_ERROR;
}

HRESULT QuerySink::SetStatus(
            /* [in] */ LONG lFlags,
            /* [in] */ HRESULT hResult,
            /* [in] */ BSTR strParam,
            /* [in] */ IWbemClassObject __RPC_FAR *pObjParam
        )
{
    printf("QuerySink::SetStatus hResult = 0x%X\n", hResult);
    return WBEM_S_NO_ERROR;
}

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows Vista
지원되는 최소 서버
Windows Server 2008
헤더
Wbemcli.h(include Wbemidl.h)
라이브러리
Wbemuuid.lib
DLL
Fastprox.dll

추가 정보

WMI용 COM API

C++를 사용하여 비동기 호출 만들기

비동기 호출에서 보안 설정

애플리케이션 기간 동안 이벤트 수신