WMI에 호출하기
공급자는 해당 메서드 구현 내에서 WMI에 의해 구현된 메서드를 호출할 수 있습니다. 그러나 공급자가 동일한 메서드의 자체 구현 내에서 IWbemServices 메서드의 WMI 구현을 호출하는 경우 특별한 고려 사항이 있습니다. 이러한 고려 사항은 공급자가 메서드의 동기 또는 비동기 버전을 호출하는지 여부에 관계없이 중요합니다.
공급자가 구현할 수 있는 각 IWbemServices 메서드에는 pCtx 매개 변수, IWbemContext 인터페이스 구현에 대한 포인터가 있습니다. WMI가 공급자를 호출하면 WMI는 이 매개 변수에 유효한 포인터를 전달합니다. 공급자는 요청을 서비스하는 동안 수행되는 WMI 호출에서 항상 동일한 포인터를 전달해야 합니다. pCtx 적절하게 설정하지 않은 경우 WMI가 무한 루프를 시작할 수 있습니다.
다음 코드 예제에서는 GetObjectAsync구현 내에서 GetObject WMI 구현을 호출하는 올바른 방법을 보여줍니다.
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
이 항목의 C++ 코드 예제에서는 다음 참조 및 #include 문이 올바르게 컴파일되어야 합니다.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
인스턴스, 클래스 및 속성 공급자는 읽기 요청을 서비스하는 동안 데이터 수정을 요청하는 WMI에 대한 호출을 실행해서는 안 됩니다. 이 규칙의 예외인 공급자는 푸시 공급자뿐입니다. 푸시 공급자는 WMI 리포지토리에 데이터를 저장하고 WMI를 사용하여 클라이언트의 요청을 처리하는 클래스 공급자입니다. 읽기 요청을 서비스하는 동안 푸시 공급자는 WMI 리포지토리를 업데이트할 수 있지만, 반드시 적절한 IWbemServices 호출에서 lFlags 매개 변수를 WBEM_FLAG_OWNER_UPDATE로 설정해야 합니다.
이벤트 공급자는 호출을 제공하는 동안 클래스를 변경하지 않아야 합니다. 또한 이벤트 필터 수정과 같은 이벤트 관련 호출을 실행할 수 없습니다.
관련 항목