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"
Dieser Parameter kann NULL sein.

[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:
    1. Stellen Sie abhängige Anforderungen mit dem Thread, der von WMI empfangen wird.
    2. 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.

Sie können ihren Anbieter in prozessintern implementieren. Ein prozessinterner Anbieter, der eine Verbindung mit WMI getrennt vom Initialisierungsprozess herstellen muss, muss den CLSID_WbemAdministrativeLocator Klassenbezeichner verwenden, um in einem Aufruf von CoCreateInstance auf IWbemLocator zuzugreifen.

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

Weitere Informationen

IWbemProviderInit

Initialisieren eines Anbieters