Compartir a través de


Implementación de un consumidor físico

Un consumidor físico es un objeto COM que implementa la interfaz IWbemUnboundObjectSink. WMI carga el consumidor físico y pasa eventos a través de IWbemUnboundObjectSink en respuesta a uno o varios eventos, según lo definido por el consumidor lógico asociado. Los consumidores permanentes tienen requisitos de seguridad especiales. Para más información, consulte Protección de eventos de WMI.

En el procedimiento siguiente se describe cómo implementar un consumidor físico para un consumidor de eventos permanente.

Para implementar un consumidor físico para un consumidor de eventos permanente

  1. Cree un objeto COM.

    Debe implementar un consumidor físico como un servidor local o remoto mediante el protocolo COM.

  2. Determine si desea admitir notificaciones de eventos sincrónicas o asincrónicas.

    Con la notificación de eventos asincrónica, el subproceso de envío no está relacionado con el subproceso receptor. Por lo tanto, ni WMI ni el proveedor de eventos se bloquean mientras WMI entrega una notificación a cualquier consumidor registrado para recibir el evento. La desventaja de la entrega asincrónica es que se produce un cambio de contexto entre el momento en que el proveedor genera el evento y el momento en que el consumidor recibe el evento. Para más información sobre cómo trabajar de forma asincrónica, vea el tema Aspectos básicos de COM en la sección COM del Kit de desarrollo de software (SDK) de Microsoft Windows. Para más información sobre los modificadores de contexto, vea el tema Modificadores de contexto en la sección DLL, Procesos y Subprocesos del SDK de Windows.

    Nota

    Dado que es posible que la devolución de llamada al receptor no se devuelva en el mismo nivel de autenticación que requiere el cliente, se recomienda usar la comunicación semisincrónica, en lugar de la asincrónica. Para más información, vea Llamada a un método.

     

    Con la notificación sincrónica, WMI entrega la notificación en el mismo subproceso que el proveedor de eventos usó para entregar el evento a WMI. En este caso, cuando un proveedor de eventos envía una notificación, WMI bloquea el proveedor de eventos hasta que WMI entregue la notificación. Solo si el consumidor es extremadamente rápido y puede procesar un evento en 100 microsegundos o menos debe considerar la posibilidad de admitir notificaciones sincrónicas. Los consumidores sincrónicos que tardan demasiado tiempo en procesar eventos pueden ralentizar seriamente la entrega de eventos a todos los demás consumidores. Además, pueden bloquear accidentalmente el proveedor. Para más información, vea Enlace de un filtro de eventos con un consumidor lógico.

  3. Implemente la función IWbemUnboundObjectSink::IndicateToConsumer.

    WMI usa la función IndicateToConsumer para pasar los punteros y eventos necesarios al consumidor físico para las comunicaciones sincrónicas y asincrónicas. La implementación de IndicateToConsumer debe contener todo el código necesario para responder a un evento.

    A diferencia de un consumidor de eventos temporal, no es necesario llamar a la interfaz IWbemLocator para ponerse en contacto con WMI. En su lugar, WMI busca un puntero al consumidor a través del proveedor de consumidores de eventos. Para más información, consulte Escritura de un proveedor de consumidores de eventos.

    Sin embargo, si desea volver a llamar a WMI, use las interfaces IWbemLocator e IWbemServices. El método tradicional para conectarse a WMI se realiza durante el proceso de inicialización del objeto COM. Para más información, consulte Crear una aplicación WMI o un script.

    Si implementa el consumidor físico como un servidor COM en proceso y se conecta a WMI por separado del proceso de inicialización, debe usar el identificador de clase CLSID_WbemAdministrativeLocator para acceder a la interfaz IWbemLocator en la llamada a CoCreateInstance.

    En el ejemplo siguiente se muestra cómo usar el identificador de clase CLSID_WbemAdministrativeLocator para acceder a la interfaz IWbemLocator.

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

    La interfaz IWbemLocator obtiene el puntero de espacio de nombres inicial a WMI en un equipo host determinado. Si no se usa el identificador CLSID_WbemAdministrativeLocator en la llamada a CoCreateInstance, se produce un error de "acceso denegado".

    En circunstancias habituales, WMI entrega eventos asincrónicos al cliente de uno en uno. Sin embargo, si un cliente no puede recibir notificaciones de eventos asincrónicas tan rápido como llegan los eventos, WMI comienza a procesar automáticamente los eventos en una sola llamada. El procesamiento por lotes automático ayuda si los tiempos de ida y vuelta son un problema, como suele ocurrir en escenarios de alto rendimiento. Sin embargo, el procesamiento por lotes no mejora el rendimiento del sistema si el cliente o el ancho de banda de red están en error.