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"
[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:
- Effettuare richieste dipendenti con il thread ricevuto da WMI.
- 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.
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 |