Método IWbemProviderInit::Initialize (wbemprov.h)

Windows Management llama al método IWbemProviderInit::Initialize para inicializar un proveedor para recibir solicitudes de cliente. Todos los tipos de proveedores deben implementar este método.

Sintaxis

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

Parámetros

[in] wszUser

Puntero al nombre de usuario, si se solicitó la inicialización por usuario en la instancia de registro de __Win32Provider para este proveedor. De lo contrario, es NULL.

Tenga en cuenta que este parámetro se establece en NULL para los proveedores de consumidores de eventos, independientemente del valor de la propiedad PerUserInitialization en la instancia de __Win32Provider para el proveedor.

[in] lFlags

Reservado. Este parámetro debe ser 0 (cero).

[in] wszNamespace

Un nombre de espacio de nombres para el que se inicializa el proveedor.

[in] wszLocale

Nombre de configuración regional para el que se inicializa el proveedor.

Cadena con el siguiente formato, donde el valor hexadecimal es un valor LCID estándar de Microsoft:

  • "MS_409"
Este parámetro puede ser NULL.

[in] pNamespace

Puntero IWbemServices a Administración de Windows. Este puntero puede atender las solicitudes realizadas por el proveedor. El proveedor debe usar el método IWbemProviderInit::AddRef en este puntero si va a volver a llamar a Windows Management durante su ejecución.

[in] pCtx

Puntero IWbemContext asociado a la inicialización. Este parámetro puede ser NULL.

Si el proveedor volverá a realizar solicitudes en administración de Windows antes de completar la inicialización, debe usar el método IWbemProviderInit::AddRef en este puntero. Para más información, consulte Llamadas a WMI.

En caso de que un proveedor deba realizar una solicitud dependiente en otro proveedor, debe volver a pasar esta cadena de contexto a WMI para evitar posibles bloqueos. Sin embargo, en el caso de una solicitud independiente, esto no es necesario y WMI genera una nueva cadena de contexto para ella.

[in] pInitSink

Puntero IWbemProviderInitSink que usa el proveedor para notificar el estado de inicialización.

Valor devuelto

El proveedor debe devolver WBEM_S_NO_ERROR e indicar su estado mediante el receptor de objetos proporcionado en el parámetro pInitSink . Sin embargo, si un proveedor devuelve WBEM_E_FAILED y no usa el receptor, la inicialización del proveedor se considera errónea.

Comentarios

Normalmente, el proveedor implementa un objeto COM mediante la herencia múltiple para admitir la interfaz IWbemProviderInit , así como su interfaz principal, como IWbemServices o IWbemEventProvider.

El estado de inicialización se notifica mediante una llamada a IWbemProviderInitSink::SetStatus. Se puede llamar a este método repetidamente para notificar el estado incremental si es necesario. El proveedor debe incrementar el recuento de referencias en este puntero llamando a su método IWbemProviderInit::AddRef antes de usarlo para comunicar el estado a La administración de Windows.

El proveedor puede usar el puntero IWbemProviderInitSink de forma sincrónica, como en el ejemplo de código siguiente.

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

El proveedor también puede usar el método AddRef en el puntero y crear un subproceso independiente para completar su inicialización y devolver inmediatamente de la llamada.

El proceso de inicialización de algunos proveedores puede implicar volver a llamar a WMI. Un proveedor que llama de nuevo a WMI y debe esperar a que se complete esa llamada se denomina proveedor dependiente. De forma similar, una llamada a WMI se denomina solicitud dependiente. Al implementar Initialize, WMI requiere que un proveedor dependiente cumpla las reglas siguientes:

  • Las solicitudes dependientes deben reutilizar el puntero IWbemContext que WMI pasó a Initialize.

    Esto significa que cualquier llamada a WMI realizada durante la inicialización debe reutilizar el puntero IWbemContext que WMI pasó. Si no lo hace, se puede producir un interbloqueo.

  • Las solicitudes no dependientes no deben reutilizar el puntero IWbemContext .
  • Los proveedores dependientes deben realizar solicitudes a WMI mediante una de las dos estrategias siguientes:
    1. Realice solicitudes dependientes con el subproceso recibido de WMI.
    2. Realice solicitudes dependientes con un nuevo subproceso creado por el proveedor.
  • Todos los proveedores deben devolver el subproceso recibido de WMI.
  • En ninguna circunstancia, WMI permite que un proveedor bloquee un subproceso recibido de WMI.

    El peligro de no controlar cuidadosamente los subprocesos entregados por WMI es que un proveedor puede adquirir todos los subprocesos del grupo de subprocesos WMI y continuar bloqueando esos subprocesos. Esto daría lugar a un sistema interbloqueo.

Puede optar por implementar el proveedor en proceso. Un proveedor en proceso que debe conectarse a WMI por separado del proceso de inicialización debe usar el identificador de clase CLSID_WbemAdministrativeLocator para acceder a IWbemLocator en una llamada a CoCreateInstance.

En el ejemplo de código siguiente se describe cómo usar el identificador de CLSID_WbemAdministrativeLocator en dicha llamada.

  IWbemLocator *pLoc = 0;

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

Si no se usa el identificador de CLSID_WbemAdministrativeLocator , se produce un error de acceso denegado. Para obtener más información sobre cómo realizar una conexión a WMI, vea Creating a WMI Application or Script.

Ejemplos

En el ejemplo de código siguiente se describe cómo implementar Initialize para un proveedor de consumidores de eventos.

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

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista
Servidor mínimo compatible Windows Server 2008
Plataforma de destino Windows
Encabezado wbemprov.h (include Wbemidl.h)
Library Wbemuuid.lib
Archivo DLL Wbemsvc.dll

Consulte también

IWbemProviderInit

Inicialización de un proveedor