Compartilhar via


Como o aplicativo libera o dispositivo WIA

Quando um aplicativo não precisa mais de um dispositivo WIA, ele chama o método IWiaItem::Release (descrito na documentação do SDK do Microsoft Windows). Quando a última referência a qualquer item WIA é lançada, o serviço WIA chama o método IWiaMiniDrv::d rvUnInitializeWia . Um minidriver WIA deve usar esse método principalmente para gerenciar recursos associados a todos os aplicativos conectados. Quando um aplicativo é fechado, os recursos associados à árvore de itens não são mais necessários. O minidriver WIA deve acompanhar todos os aplicativos conectados incrementando um contador de referência em IWiaMiniDrv::d rvInitializeWia e diminuindo esse contador de referência em IWiaMiniDrv::d rvUnInitializeWia. Liberar recursos neste ponto pode causar problemas para outros aplicativos conectados. Quando o contador de referência atinge zero, não há mais aplicativos conectados ao minidriver WIA. O minidriver deve limpo todos os recursos alocados adquiridos durante as conexões de aplicativo.

Observação **** O método IWiaMiniDrv::d rvUnInitializeWia não descarrega o driver. O driver pode ser chamado novamente para processar eventos ou quando um aplicativo pretende se comunicar com ele. Uma chamada para esse método não significa que todos os clientes estão desconectados. Deve haver uma chamada por desconexão do cliente. Cada chamada para o método IWiaMiniDrv::d rvUnInitializeWia deve ser emparelhada com uma chamada correspondente ao método IWiaMiniDrv::d rvInitializeWia .

O driver WIA não deve liberar nenhum recurso de driver nessa chamada de método, a menos que possa determinar com segurança que nenhum aplicativo está conectado no momento.

Para determinar a contagem de conexões de aplicativo atual, o driver WIA deve incrementar uma variável de membro de classe como um contador de referência para acompanhar as chamadas de método para IWiaMiniDrv::d rvInitializeWia (incrementando o contador) e IWiaMiniDrv::d rvUnInitializeWia (decrementando o contador).

O exemplo a seguir mostra uma implementação do 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;
}