Condividi tramite


Metodo IWbemProviderInit::Initialize (wbemprov.h)

Il metodo IWbemProviderInit::Initialize viene chiamato da Gestione Windows per inizializzare un provider per ricevere le richieste client. Tutti i tipi di provider devono implementare questo metodo.

Sintassi

HRESULT Initialize(
  [in] LPWSTR                wszUser,
  [in] LONG                  lFlags,
  [in] LPWSTR                wszNamespace,
  [in] LPWSTR                wszLocale,
  [in] IWbemServices         *pNamespace,
  [in] IWbemContext          *pCtx,
  [in] IWbemProviderInitSink *pInitSink
);

Parametri

[in] wszUser

Puntatore al nome utente, se l'inizializzazione per utente è stata richiesta nell'istanza di registrazione __Win32Provider per questo provider. In caso contrario, si tratta di NULL.

Tenere presente che questo parametro è impostato su NULL per i provider di consumer eventi indipendentemente dal valore della proprietà PerUserInitialization nell'istanza di __Win32Provider per il provider.

[in] lFlags

Riservato. Questo parametro deve essere 0 (zero).

[in] wszNamespace

Nome dello spazio dei nomi per il quale viene inizializzato il provider.

[in] wszLocale

Nome delle impostazioni locali per cui viene inizializzato il provider.

Stringa del formato seguente, in cui il valore esadecimale è un valore LCID standard Microsoft:

  • "MS_409"
Questo parametro può essere NULL.

[in] pNamespace

Puntatore IWbemServices in Gestione Windows. Questo puntatore è in grado di eseguire qualsiasi richiesta effettuata dal provider. Il provider deve usare il metodo IWbemProviderInit::AddRef in questo puntatore se verrà richiamato in Gestione Windows durante l'esecuzione.

[in] pCtx

Puntatore IWbemContext associato all'inizializzazione. Questo parametro può essere NULL.

Se il provider eseguirà nuovamente le richieste in Gestione Windows prima di completare l'inizializzazione, deve usare il metodo IWbemProviderInit::AddRef in questo puntatore. Per altre informazioni, vedere Creazione di chiamate a WMI.

Se un provider deve effettuare una richiesta dipendente da un altro provider, è necessario passare nuovamente questa stringa di contesto a WMI per evitare potenziali blocchi. Tuttavia, nel caso di una richiesta indipendente, non è necessario e WMI genera una nuova stringa di contesto.

[in] pInitSink

Puntatore IWbemProviderInitSink usato dal provider per segnalare lo stato di inizializzazione.

Valore restituito

Il provider deve restituire WBEM_S_NO_ERROR e indicare lo stato usando il sink di oggetti fornito nel parametro pInitSink . Tuttavia, se un provider restituisce WBEM_E_FAILED e non usa il sink, l'inizializzazione del provider viene considerata non riuscita.

Commenti

In genere, il provider implementa un oggetto COM usando più ereditarietà per supportare sia l'interfaccia IWbemProviderInit che l'interfaccia primaria, ad esempio IWbemServices o IWbemEventProvider.

Lo stato di inizializzazione viene segnalato chiamando IWbemProviderInitSink::SetStatus. Questo metodo può essere chiamato ripetutamente per segnalare lo stato incrementale, se necessario. Il provider deve incrementare il conteggio dei riferimenti su questo puntatore chiamando il relativo metodo IWbemProviderInit::AddRef prima di usarlo per comunicare lo stato a Gestione Windows.

Il provider può usare il puntatore IWbemProviderInitSink in modo sincrono, come nell'esempio di codice seguente.

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;
}

Il provider può anche usare il metodo AddRef sul puntatore e creare un thread separato per completare l'inizializzazione e restituire immediatamente dalla chiamata.

Il processo di inizializzazione di alcuni provider può comportare la chiamata a WMI. Un provider che chiama WMI e deve attendere il completamento della chiamata viene chiamato provider dipendente. Analogamente, una chiamata a WMI viene chiamata richiesta dipendente. Quando si implementa Initialize, WMI richiede che un provider dipendente rispetti le regole seguenti:

  • Le richieste dipendenti devono riutilizzare il puntatore IWbemContext passato a Initialize.

    Ciò significa che tutte le chiamate in WMI effettuate durante l'inizializzazione devono riutilizzare il puntatore IWbemContext passato a WMI. Non è possibile eseguire questa operazione in caso di deadlock.

  • Le richieste non dipendenti non devono riutilizzare il puntatore IWbemContext .
  • I provider dipendenti devono effettuare richieste a WMI usando una delle due strategie seguenti:
    1. Effettuare richieste dipendenti con il thread ricevuto da WMI.
    2. Effettuare richieste dipendenti con un nuovo thread creato dal provider.
  • Tutti i provider devono restituire il thread ricevuto da WMI.
  • In nessun caso, WMI consente a un provider di bloccare un thread ricevuto da WMI.

    Il pericolo di non gestire attentamente i thread recapitati da WMI è che un provider può acquisire tutti i thread nel pool di thread WMI e procedere per bloccare tali thread. Ciò comporta un sistema deadlock.

È possibile scegliere di implementare il provider in-process. Un provider in-process che deve connettersi a WMI separatamente dal processo di inizializzazione deve usare l'identificatore di classe CLSID_WbemAdministrativeLocator per accedere a IWbemLocator in una chiamata a CoCreateInstance.

Nell'esempio di codice seguente viene descritto come usare l'identificatore di CLSID_WbemAdministrativeLocator in tale chiamata.

  IWbemLocator *pLoc = 0;

  DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, 
      CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

Non è possibile usare l'identificatore di CLSID_WbemAdministrativeLocator che genera un errore di accesso negato. Per altre informazioni sull'esecuzione di una connessione a WMI, vedere Creazione di un'applicazione WMI o di uno script.

Esempio

Nell'esempio di codice seguente viene descritto come implementare Initialize per un provider consumer di eventi.

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;
}

Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Server minimo supportato Windows Server 2008
Piattaforma di destinazione Windows
Intestazione wbemprov.h (include Wbemidl.h)
Libreria Wbemuuid.lib
DLL Wbemsvc.dll

Vedi anche

IWbemProviderInit

Inizializzazione di un provider