Compartir a través de


Cómo libera la aplicación el dispositivo WIA

Cuando una aplicación no necesita más un dispositivo WIA, llama al método IWiaItem::Release (descrito en la documentación de Microsoft Windows SDK). Cuando se libera la última referencia a cualquier elemento WIA, el servicio WIA llama al método IWiaMiniDrv::d rvUnInitializeWia . Un minidriver WIA debe usar este método principalmente para administrar los recursos asociados a todas las aplicaciones conectadas. Cuando se cierra una aplicación, los recursos asociados a su árbol de elementos ya no son necesarios. El minidriver WIA debe realizar un seguimiento de todas las aplicaciones conectadas incrementando un contador de referencia en IWiaMiniDrv::d rvInitializeWia y disminuyendo ese contador de referencia en IWiaMiniDrv::d rvUnInitializeWia. Liberar recursos en este momento puede causar problemas para otras aplicaciones conectadas. Cuando el contador de referencia alcanza cero, no hay más aplicaciones conectadas al minidriver WIA. El minidriver debe limpiar los recursos asignados que adquirió durante las conexiones de aplicación.

Nota *** El método IWiaMiniDrv::d rvUnInitializeWia no descarga el controlador. Se puede llamar de nuevo al controlador para procesar eventos o cuando una aplicación pretende comunicarse con él. Una llamada a este método no significa que todos los clientes estén desconectados. Debe haber una llamada por cada desconexión del cliente. Cada llamada al método IWiaMiniDrv::d rvUnInitializeWia debe emparejarse con una llamada correspondiente al método IWiaMiniDrv::d rvInitializeWia .

El controlador WIA no debe liberar ningún recurso de controlador en esta llamada al método a menos que pueda determinar de forma segura que no hay aplicaciones conectadas actualmente.

Para determinar el recuento de conexiones de la aplicación actual, el controlador WIA debe incrementar una variable miembro de clase como contador de referencia para realizar un seguimiento de las llamadas de método a IWiaMiniDrv::d rvInitializeWia (incrementando el contador) e IWiaMiniDrv::d rvUnInitializeWia (disminuyendo el contador).

En el ejemplo siguiente se muestra una implementación del método IWiaMiniDrv::d rvUnInitializeWia .

HRESULT _stdcall CWIADevice::drvUnInitializeWia(BYTE *pWiasContext)
{
  //
  // If the caller did not pass in the correct parameters,
  // then fail the call with E_INVALIDARG.
  //

  if (!pWiasContext) {
      return E_INVALIDARG;
  }

  InterlockedDecrement(&m_lClientsConnected);

  //
  // make sure we never decrement below zero (0)
  //

  if(m_lClientsConnected < 0){
      m_lClientsConnected = 0;
  return S_OK;
  }

  //
  // check for connected applications.
  //

  if(m_lClientsConnected == 0){

      //
      // There are no application clients connected to this WIA driver
      //

  }

  return S_OK;
}