IWbemProviderInit::Initialize 메서드(wbemprov.h)
IWbemProviderInit::Initialize 메서드는 Windows Management에서 호출되어 클라이언트 요청을 수신하도록 공급자를 초기화합니다. 모든 유형의 공급자는 이 메서드를 구현해야 합니다.
구문
HRESULT Initialize(
[in] LPWSTR wszUser,
[in] LONG lFlags,
[in] LPWSTR wszNamespace,
[in] LPWSTR wszLocale,
[in] IWbemServices *pNamespace,
[in] IWbemContext *pCtx,
[in] IWbemProviderInitSink *pInitSink
);
매개 변수
[in] wszUser
이 공급자에 대한 __Win32Provider 등록 instance 사용자별 초기화가 요청된 경우 사용자 이름에 대한 포인터입니다. 그렇지 않으면 NULL입니다.
이 매개 변수는 공급자에 대한 __Win32Provider instancePerUserInitialization 속성 값에 관계없이 이벤트 소비자 공급자에 대해 NULL로 설정됩니다.
[in] lFlags
예약되어 있습니다. 이 매개 변수는 0이어야 합니다.
[in] wszNamespace
공급자가 초기화되는 네임스페이스 이름입니다.
[in] wszLocale
공급자가 초기화되는 로캘 이름입니다.
16진수 값이 Microsoft 표준 LCID 값인 다음 형식의 문자열입니다.
- "MS_409"
[in] pNamespace
Windows Management에 대한 IWbemServices 포인터입니다. 이 포인터는 공급자가 수행한 모든 요청을 처리할 수 있습니다. 공급자는 실행 중에 Windows Management로 다시 호출하려는 경우 이 포인터에서 IWbemProviderInit::AddRef 메서드를 사용해야 합니다.
[in] pCtx
초기화와 연결된 IWbemContext 포인터입니다 . 이 매개 변수는 NULL일 수 있습니다.
공급자가 초기화를 완료하기 전에 Windows Management로 요청을 다시 수행하는 경우 이 포인터에서 IWbemProviderInit::AddRef 메서드를 사용해야 합니다. 자세한 내용은 WMI 호출을 참조하세요.
공급자가 다른 공급자에 종속된 요청을 수행해야 하는 경우 잠재적인 잠금을 방지하려면 이 컨텍스트 문자열을 WMI에 다시 전달해야 합니다. 그러나 독립적인 요청의 경우 필요하지 않으며 WMI는 이에 대한 새 컨텍스트 문자열을 생성합니다.
[in] pInitSink
공급자가 초기화 상태 보고하는 데 사용하는 IWbemProviderInitSink 포인터입니다.
반환 값
공급자는 WBEM_S_NO_ERROR 반환하고 pInitSink 매개 변수에서 제공된 개체 싱크를 사용하여 해당 상태 나타내야 합니다. 그러나 공급자가 WBEM_E_FAILED 반환하고 싱크를 사용하지 않는 경우 공급자 초기화는 실패한 것으로 간주됩니다.
설명
일반적으로 공급자는 여러 상속을 사용하여 IWbemProviderInit 인터페이스와 IWbemServices 또는 IWbemEventProvider와 같은 기본 인터페이스를 모두 지원하는 COM 개체를 구현합니다.
초기화 상태 IWbemProviderInitSink::SetStatus를 호출하여 보고됩니다. 필요한 경우 이 메서드를 반복적으로 호출하여 증분 상태 보고할 수 있습니다. 공급자는 IWbemProviderInit::AddRef 메서드를 호출하여 이 포인터에 대한 참조 횟수를 증가시켜야 Windows Management에 상태 통신합니다.
공급자는 다음 코드 예제와 같이 IWbemProviderInitSink 포인터를 동기적으로 사용할 수 있습니다.
HRESULT SampleProvider::Initialize(
/* [unique][in] */ LPWSTR wszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR wszNamespace,
/* [unique][in] */ LPWSTR wszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
// Use AddRef on the pNamespace pointer, if required.
// Analyze other parameters.
// Tell Windows Management that you are initialized.
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
return WBEM_S_NO_ERROR;
}
공급자는 포인터에서 AddRef 메서드를 사용하고 별도의 스레드를 만들어 초기화를 완료하고 호출에서 즉시 반환할 수도 있습니다.
일부 공급자의 초기화 프로세스에는 WMI로 다시 호출하는 작업이 포함될 수 있습니다. WMI로 다시 호출하고 해당 호출이 완료되기를 기다려야 하는 공급자를 종속 공급자라고 합니다. 마찬가지로 WMI 호출을 종속 요청이라고 합니다. Initialize를 구현할 때 WMI를 사용하려면 종속 공급자가 다음 규칙을 준수해야 합니다.
-
종속 요청은 WMI가 Initialize에 전달한 IWbemContext 포인터를 다시 사용해야 합니다.
즉, 초기화 중에 수행된 WMI에 대한 모든 호출은 WMI가 전달한 IWbemContext 포인터를 다시 사용해야 합니다. 이렇게 하지 않으면 교착 상태가 발생할 수 있습니다.
- 종속되지 않은 요청은 IWbemContext 포인터를 다시 사용해서는 안 됩니다.
-
종속 공급자는 다음 두 가지 전략 중 하나를 사용하여 WMI를 요청해야 합니다.
- WMI에서 받은 스레드를 사용하여 종속 요청을 합니다.
- 공급자가 만든 새 스레드를 사용하여 종속 요청을 합니다.
- 모든 공급자는 WMI에서 받은 스레드를 반환해야 합니다.
-
어떤 상황에서도 WMI는 공급자가 WMI로부터 받은 스레드를 차단하도록 허용하지 않습니다.
WMI에서 제공하는 스레드를 신중하게 처리하지 않을 경우 공급자가 WMI 스레드 풀의 모든 스레드를 획득하고 해당 스레드를 계속 차단할 수 있다는 위험이 있습니다. 이로 인해 시스템이 교착 상태가 발생합니다.
다음 코드 예제에서는 이러한 호출에서 CLSID_WbemAdministrativeLocator 식별자를 사용하는 방법을 설명합니다.
IWbemLocator *pLoc = 0;
DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
CLSID_WbemAdministrativeLocator 식별자를 사용하지 않으면 액세스 거부 오류가 발생합니다. WMI에 연결하는 방법에 대한 자세한 내용은 WMI 애플리케이션 또는 스크립트 만들기를 참조하세요.
예제
다음 코드 예제에서는 이벤트 소비자 공급자에 대해 Initialize 를 구현하는 방법을 설명합니다.
HRESULT CMyEventConsumer::Initialize(
/* [in] */ LPWSTR pszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR pszNamespace,
/* [in] */ LPWSTR pszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
// Optionally, examine the namespace, locale, and so on
// being used.
return WBEM_S_NO_ERROR;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista |
지원되는 최소 서버 | Windows Server 2008 |
대상 플랫폼 | Windows |
헤더 | wbemprov.h(Wbemidl.h 포함) |
라이브러리 | Wbemuuid.lib |
DLL | Wbemsvc.dll |