Partager via


Comment l’application libère l’appareil WIA

Lorsqu’une application n’a plus besoin d’un appareil WIA, elle appelle la méthode IWiaItem::Release (décrite dans la documentation Microsoft Windows SDK). Lorsque la dernière référence à un élément WIA est publiée, le service WIA appelle la méthode IWiaMiniDrv::d rvUnInitializeWia . Un minidriver WIA doit utiliser cette méthode principalement pour gérer les ressources associées à toutes les applications connectées. Lorsqu’une application se ferme, les ressources associées à son arborescence d’éléments ne sont plus nécessaires. Le minidriver WIA doit suivre toutes les applications connectées en incrémentant un compteur de référence dans IWiaMiniDrv::d rvInitializeWia et en décrémentant ce compteur de référence dans IWiaMiniDrv::d rvUnInitializeWia. La libération de ressources à ce stade peut entraîner des problèmes pour d’autres applications connectées. Lorsque le compteur de référence atteint zéro, il n’y a plus d’applications connectées au minidriver WIA. Le minidriver doit propre toutes les ressources allouées qu’il a acquises lors des connexions d’application.

Remarque **** La méthode IWiaMiniDrv::d rvUnInitializeWia ne décharge pas le pilote. Le pilote peut être appelé à nouveau pour traiter des événements ou lorsqu’une application a l’intention de communiquer avec lui. Un appel à cette méthode ne signifie pas que tous les clients sont déconnectés. Il doit y avoir un appel par déconnexion du client. Chaque appel à la méthode IWiaMiniDrv::d rvUnInitializeWia doit être associé à un appel correspondant à la méthode IWiaMiniDrv::d rvInitializeWia .

Le pilote WIA ne doit libérer aucune ressource de pilote dans cet appel de méthode, sauf s’il peut déterminer en toute sécurité qu’aucune application n’est actuellement connectée.

Pour déterminer le nombre actuel de connexions d’application, le pilote WIA doit incrémenter une variable membre de classe en tant que compteur de référence pour suivre les appels de méthode à IWiaMiniDrv::d rvInitializeWia (incrémentation du compteur) et IWiaMiniDrv::d rvUnInitializeWia (décrémentation du compteur).

L’exemple suivant montre une implémentation de la méthode 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;
}