IWbemProviderInit::Initialize-Methode (wbemprov.h)
Die IWbemProviderInit::Initialize-Methode wird von der Windows-Verwaltung aufgerufen, um einen Anbieter zum Empfangen von Clientanforderungen zu initialisieren. Alle Anbietertypen müssen diese Methode implementieren.
Syntax
HRESULT Initialize(
[in] LPWSTR wszUser,
[in] LONG lFlags,
[in] LPWSTR wszNamespace,
[in] LPWSTR wszLocale,
[in] IWbemServices *pNamespace,
[in] IWbemContext *pCtx,
[in] IWbemProviderInitSink *pInitSink
);
Parameter
[in] wszUser
Ein Zeiger auf den Benutzernamen, wenn die Initialisierung pro Benutzer im __Win32Provider Registrierung instance für diesen Anbieter angefordert wurde. Andernfalls ist der Wert NULL.
Beachten Sie, dass dieser Parameter für Ereignis consumeranbieter unabhängig vom Wert der PerUserInitialization-Eigenschaft im __Win32Provider instance für den Anbieter auf NULL festgelegt ist.
[in] lFlags
Reserviert. Dieser Parameter muss 0 (null) sein.
[in] wszNamespace
Ein Namespacename, für den der Anbieter initialisiert wird.
[in] wszLocale
Gebietsschemaname, für den der Anbieter initialisiert wird.
Eine Zeichenfolge im folgenden Format, wobei der Hexwert ein Microsoft-Standard-LCID-Wert ist:
- "MS_409"
[in] pNamespace
Ein IWbemServices-Zeiger zurück zur Windows-Verwaltung. Dieser Zeiger kann alle Anforderungen des Anbieters verarbeiten. Der Anbieter sollte die IWbemProviderInit::AddRef-Methode für diesen Zeiger verwenden, wenn er während der Ausführung die Windows-Verwaltung zurückruft.
[in] pCtx
Ein IWbemContext-Zeiger , der der Initialisierung zugeordnet ist. Dieser Parameter kann NULL sein.
Wenn der Anbieter Anforderungen zurück an die Windows-Verwaltung ausführt, bevor er die Initialisierung abgeschlossen hat, sollte er die IWbemProviderInit::AddRef-Methode für diesen Zeiger verwenden. Weitere Informationen finden Sie unter Richten von Aufrufen an WMI.
Für den Fall, dass ein Anbieter eine abhängige Anforderung für einen anderen Anbieter stellen muss, müssen Sie diese Kontextzeichenfolge zurück an WMI übergeben, um potenzielle Sperren zu vermeiden. Im Fall einer unabhängigen Anforderung ist dies jedoch nicht erforderlich, und WMI generiert eine neue Kontextzeichenfolge dafür.
[in] pInitSink
Ein IWbemProviderInitSink-Zeiger, der vom Anbieter verwendet wird, um die Initialisierung status zu melden.
Rückgabewert
Der Anbieter sollte WBEM_S_NO_ERROR zurückgeben und seine status mithilfe der angegebenen Objektsenke im pInitSink-Parameter angeben. Wenn ein Anbieter jedoch WBEM_E_FAILED zurückgibt und die Senke nicht verwendet, wird die Anbieterinitialisierung als fehlgeschlagen betrachtet.
Hinweise
In der Regel implementiert der Anbieter ein COM-Objekt mit mehrfacher Vererbung, um sowohl die IWbemProviderInit-Schnittstelle als auch ihre primäre Schnittstelle wie IWbemServices oder IWbemEventProvider zu unterstützen.
Initialisierung status wird durch Aufrufen von IWbemProviderInitSink::SetStatus gemeldet. Diese Methode kann wiederholt aufgerufen werden, um bei Bedarf inkrementelle status zu melden. Der Anbieter muss die Verweisanzahl für diesen Zeiger erhöhen, indem er seine IWbemProviderInit::AddRef-Methode aufruft, bevor er sie verwendet, um status an die Windows-Verwaltung zu kommunizieren.
Der Anbieter kann den IWbemProviderInitSink-Zeiger synchron verwenden, wie im folgenden Codebeispiel gezeigt.
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;
}
Der Anbieter kann auch die AddRef-Methode auf dem Zeiger verwenden und einen separaten Thread erstellen, um die Initialisierung abzuschließen und sofort vom Aufruf zurückzukehren.
Der Initialisierungsprozess einiger Anbieter kann das Zurückrufen von WMI umfassen. Ein Anbieter, der WMI zurückruft und warten muss, bis dieser Aufruf abgeschlossen ist, wird als abhängiger Anbieter bezeichnet. In ähnlicher Weise wird ein Aufruf von WMI als abhängige Anforderung bezeichnet. Bei der Implementierung von Initialize erfordert WMI, dass ein abhängiger Anbieter die folgenden Regeln befolgt:
-
Abhängige Anforderungen müssen den IWbemContext-Zeiger wiederverwenden , den WMI an Initialize übergeben hat.
Dies bedeutet, dass alle Aufrufe von WMI während der Initialisierung den IWbemContext-Zeiger wiederverwenden müssen, den WMI übergeben hat. Wenn dies nicht geschieht, kann dies zu einem Deadlock führen.
- Nicht abhängige Anforderungen dürfen den IWbemContext-Zeiger nicht wiederverwenden.
-
Abhängige Anbieter müssen Anforderungen an WMI mit einer der folgenden beiden Strategien stellen:
- Stellen Sie abhängige Anforderungen mit dem Thread, der von WMI empfangen wird.
- Stellen Sie abhängige Anforderungen mit einem neuen Thread aus, der vom Anbieter erstellt wurde.
- Alle Anbieter müssen den von WMI empfangenen Thread zurückgeben.
-
Unter keinen Umständen erlaubt WMI einem Anbieter, einen von WMI empfangenen Thread zu blockieren.
Die Gefahr, dass die von WMI bereitgestellten Threads nicht sorgfältig behandelt werden, besteht darin, dass ein Anbieter alle Threads im WMI-Threadpool abrufen und diese Threads blockieren kann. Dies würde zu einem Deadlocksystem führen.
Im folgenden Codebeispiel wird beschrieben, wie Sie den CLSID_WbemAdministrativeLocator-Bezeichner in einem solchen Aufruf verwenden.
IWbemLocator *pLoc = 0;
DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
Fehler bei der Verwendung des CLSID_WbemAdministrativeLocator-Bezeichners führt zu einem Fehler Vom Zugriff verweigert. Weitere Informationen zum Herstellen einer Verbindung mit WMI finden Sie unter Erstellen einer WMI-Anwendung oder eines WMI-Skripts.
Beispiele
Im folgenden Codebeispiel wird beschrieben, wie Initialize für einen Ereignis-Consumeranbieter implementiert wird.
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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista |
Unterstützte Mindestversion (Server) | Windows Server 2008 |
Zielplattform | Windows |
Kopfzeile | wbemprov.h (include Wbemidl.h) |
Bibliothek | Wbemuuid.lib |
DLL | Wbemsvc.dll |