IWbemEventConsumerProvider::FindConsumer 메서드(wbemprov.h)
FindConsumer 함수는 WMI가 이벤트를 보낼 수 있는 싱크 개체를 찾아 반환합니다. WMI는 논리 소비자 개체에 대한 포인터를 전달한 다음 FindConsumer 는 논리 소비자와 연결된 물리적 소비자를 찾습니다. 마지막으로 FindConsumer 는 실제 소비자에 속하는 싱크에 대한 포인터를 WMI로 반환합니다. WMI는 싱크에서 AddRef 를 호출하고 싱크에 적절한 이벤트를 전달하기 시작합니다. WMI는 배달 없이 구성 가능한 기간 후에 싱크를 해제합니다. 필요한 경우 WMI는 FindConsumer를 다시 호출하여 싱크를 다시 로드할 수 있습니다.
구문
HRESULT FindConsumer(
[in] IWbemClassObject *pLogicalConsumer,
[out] IWbemUnboundObjectSink **ppConsumer
);
매개 변수
[in] pLogicalConsumer
이벤트 개체를 전달할 논리적 소비자 개체에 대한 포인터입니다.
[out] ppConsumer
Windows Management에 이벤트 개체 싱크를 반환합니다. Windows Management는 이 포인터에 대해 AddRef 를 호출하고 논리 소비자와 연결된 이벤트를 이 싱크에 전달합니다. 결국 적절한 시간 초과 후 Windows Management는 포인터에 대해 Release 를 호출합니다.
반환 값
이 메서드는 메서드 호출의 상태를 나타내는 HRESULT를 반환합니다. 다음 목록에는 HRESULT에 포함된 값이 나열되어 있습니다.
설명
Windows Management는 IWbemClassObject 형식의 이벤트를 스키마 내에 등록된 논리 소비자에게 제공합니다. 소비자 공급자는 FindConsumer 를 구현하여 이벤트가 논리 소비자에게 전달되어야 할 때마다 Windows Management에 이벤트 싱크를 제공합니다.
Windows Management는 논리 소비자 개체를 인식하고 이벤트 개체를 배달할 준비가 되었습니다. 그런 다음, WMI는 이벤트 개체를 전달하기 위해 FindConsumer를 호출합니다. 소비자 공급자는 이벤트 싱크 개체( IWbemUnboundObjectSink에 대한 포인터)를 만들고 이벤트가 전달될 수 있도록 Windows Management에 대한 포인터를 반환해야 합니다.
이 기술을 사용하면 단일 이벤트 소비자 공급자가 각각에 대해 서로 다른 IWbemUnboundObjectSink 포인터를 반환하여 다양한 논리 소비자에게 이벤트 배달을 처리할 수 있습니다.
FindConsumer는 다음과 같은 여러 가지 방법으로 구현할 수 있습니다.
-
모든 논리 소비자에 대해 단일 싱크를 제공합니다.
이 방법은 하나의 COM 개체만 메모리에 저장되므로 공간 측면에서 가장 효율적입니다. 예를 들어 파일에 메시지를 기록하는 논리 소비자를 위한 싱크를 제공하는 이벤트 소비자 공급자를 고려합니다. 단일 싱크는 각 논리 소비자에 포함된 데이터를 검사하고 진행 방법을 결정해야 합니다. 수신된 각 이벤트에는 로그 파일 열기, 메시지 로깅, 파일 닫기 등이 포함됩니다. 공간 측면에서 효율적이지만 이 전략에는 상당한 처리 시간이 수반됩니다.
-
각 논리 소비자에 대해 다른 싱크를 제공합니다.
이 방법은 이벤트가 발생할 때 전용 싱크가 이벤트를 수신할 준비가 되도록 하여 성능을 최적화합니다. 이 전략은 단일 싱크보다 빠르지만 메모리 측면에서 비용 때문에 효율성이 떨어집니다. 각 싱크는 자체 로그 파일을 유지 관리하므로 이벤트가 발생할 때 항상 파일을 열고 메시지를 기록할 준비가 될 수 있습니다. 그런 다음, WMI가 시간 초과 후 싱크를 해제할 때 싱크를 닫아 고속 및 저속 배달 시나리오에서 효율적인 성능을 제공할 수 있습니다.
-
논리 소비자를 그룹으로 나누고 각 그룹에 대해 다른 싱크를 제공합니다.
이 접근 방식은 성능과 효율성 간에 손상됩니다. 하이브리드 접근 방식에는 기록할 메시지 유형에 각각 연결된 몇 가지 다른 로그 파일이 포함될 수 있습니다. 여러 COM 개체가 열려 있는 여러 파일을 처리합니다. 이 방법을 사용하는 이벤트 소비자 공급자는 FindConsumer 호출 중에 로그 파일 이름을 읽고, 파일을 열고, 모든 메시지를 이 파일에 기록하는 싱크를 반환합니다. 공급자는 Release 메서드에 대한 마지막 호출에서 파일을 닫습니다. 이 방법을 사용하면 소비자는 사용할 파일에 대한 정보가 있으므로 효율성을 유지합니다. 소비자는 새 파일을 검색하거나 열 필요가 없습니다. 또한 소비자는 다른 메시지를 동일한 파일에 기록하는 싱크를 결합하여 메모리를 저장할 수 있습니다.
예제
다음 코드 예제에서는 FindConsumer의 구현을 설명합니다. 다음 구현에서는 이벤트를 수신하기 위해 두 개의 싱크가 있다고 가정합니다. 하나는 등록된 두 이벤트 필터 각각에 대해 하나씩입니다. FindConsumer가 WMI로 다시 보내는 싱크를 결정하기 위해 코드는 들어오는 논리 소비자 개체를 검사합니다.
HRESULT MyEventConsumerClass::FindConsumer(
/* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
/* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
)
{
// Examine the logical consumer to see which one it is.
// ====================================================
VARIANT v;
VariantInit(&v);
HRESULT hRes = WBEM_E_NOT_FOUND;
*ppConsumer = 0;
pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);
// Decide which of the two logical consumers to send back.
// =======================================================
if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
{
//send back the Consumer1 sink to WMI
// For example:
/*hRes = m_pConsumer1->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
{
//send back the Consumer2 sink to WMI
// For example:
/*hRes = m_pConsumer2->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
VariantClear(&v);
return hRes;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista |
지원되는 최소 서버 | Windows Server 2008 |
대상 플랫폼 | Windows |
헤더 | wbemprov.h(Wbemidl.h 포함) |
라이브러리 | Wbemuuid.lib |
DLL | Wbemsvc.dll |