アプリケーションで 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;
}