次の方法で共有


アプリケーションで WIA デバイスを解放する方法

アプリケーションを WIA デバイスがこれ以上必要としない場合、IWiaItem::Release メソッドを呼び出します (Microsoft Windows SDK のドキュメントで説明)。 いずれかの WIA 項目への最後の参照が解放されると、WIA サービスは IWiaMiniDrv::d rvUnInitializeWia メソッドを呼び出します。 WIA ミニドライバーは、主に接続されているすべてのアプリケーションに関連付けられているリソースを管理するためにこの方法を使用します。 アプリケーションが閉じると、その項目ツリーに関連付けられているリソースは不要になります。 WIA ミニドライバーは、IWiaMiniDrv::d rvInitializeWia で参照カウンターを増やし、IWiaMiniDrv::d rvUnInitializeWia でその参照カウンターを減らし、接続されているすべてのアプリケーションを追跡します。 この時点でリソースを解放すると、接続されている他のアプリケーションで問題が発生する可能性があります。 参照カウンターが 0 に達すると、WIA ミニドライバーに接続されているアプリケーションはなくなります。 ミニドライバーは、アプリケーション接続中に取得した割り当てられたリソースをクリーンアップします。

**** IWiaMiniDrv::d rvUnInitializeWia メソッドはドライバーをアンロードすることはありません。 ドライバーは、イベントを処理するために再度呼び出される場合や、アプリケーションがイベントと通信する場合に呼び出される場合があります。 このメソッドを呼び出しても、すべてのクライアントが切断されるわけではありません。 クライアントが切断されるたびに、1 回呼び出されます。 IWiaMiniDrv::d rvUnInitializeWia メソッドの各呼び出しは、IWiaMiniDrv::d rvInitializeWia メソッドへの対応する呼び出しとペアにする必要があります。

WIA ドライバーは、現在接続されているアプリケーションがないことを安全に判断できる場合を除き、このメソッド呼び出しでドライバー リソースを解放しないでください。

現在のアプリケーション接続数を確認するに当たり、WIA ドライバーは IWiaMiniDrv::d rvInitializeWia (カウンターのインクリメント) と IWiaMiniDrv::d rvUnInitializeWia (カウンターのデクリメント) へのメソッド呼び出しを追跡するための参照カウンターとしてクラス メンバー変数を増やします。

次のコード例は、WiaMiniDrv::drvUnInitializeWia メソッドの実装を示しています。

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;
}