Condividi tramite


Come l'applicazione rilascia il dispositivo WIA

Quando un'applicazione non ha più bisogno di un dispositivo WIA, chiama il metodo IWiaItem::Release (descritto nella documentazione di Microsoft Windows SDK). Quando viene rilasciato l'ultimo riferimento a qualsiasi elemento WIA, il servizio WIA chiama il metodo IWiaMiniDrv::d rvUnInitializeWia . Un minidriver WIA deve usare questo metodo principalmente per gestire le risorse associate a tutte le applicazioni connesse. Quando un'applicazione viene chiusa, le risorse associate alla relativa struttura ad albero degli elementi non sono più necessarie. Il minidriver WIA deve tenere traccia di tutte le applicazioni connesse incrementando un contatore di riferimento in IWiaMiniDrv::d rvInitializeWia e decrementando tale contatore di riferimento in IWiaMiniDrv::d rvUnInitializeWia. A questo punto, la liberazione delle risorse può causare problemi per altre applicazioni connesse. Quando il contatore dei riferimenti raggiunge zero, non sono presenti altre applicazioni connesse al minidriver WIA. Il minidriver deve pulire le risorse allocate acquisite durante le connessioni dell'applicazione.

Nota ** Il metodo IWiaMiniDrv::d rvUnInitializeWia non scarica il driver. Il driver può essere chiamato di nuovo per elaborare gli eventi o quando un'applicazione intende comunicare con esso. Una chiamata a questo metodo non significa che tutti i client siano disconnessi. Deve essere presente una chiamata per ogni disconnessione client. Ogni chiamata al metodo IWiaMiniDrv::d rvUnInitializeWia deve essere associata a una chiamata corrispondente al metodo IWiaMiniDrv::d rvInitializeWia .

Il driver WIA non deve liberare risorse driver in questa chiamata al metodo, a meno che non possa determinare in modo sicuro che nessuna applicazione sia attualmente connessa.

Per determinare il numero di connessioni dell'applicazione corrente, il driver WIA deve incrementare una variabile membro della classe come contatore di riferimento per tenere traccia delle chiamate del metodo a IWiaMiniDrv::d rvInitializeWia (incrementando il contatore) e IWiaMiniDrv::d rvUnInitializeWia (decrementando il contatore).

L'esempio seguente mostra un'implementazione del metodo 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;
}