WIA ミニドライバーには、WIA 項目ツリー構造をいつでも変更する機能があります。 ミニドライバーが WIA 項目ツリーに変更を行うとき、ミニドライバーは WIA サービスに通知する必要があります。 WIA サービスは、接続されているすべての WIA アプリケーションに通知します。 通知を受信した後、WIA アプリケーションは、変更の結果を決定する WIA 項目ツリーを列挙する必要があります。
ミニドライバーは WIA サービス ユーティリティ関数 wiasQueueEvent を使用して、ツリー構造の変更を WIA サービスに伝達します。 WIA ミニドライバーは、 IWiaMiniDrv::d rvGetCapabilities で報告されたイベントのみをキューに登録できます。 WIA イベントのレポートの詳細については、「 イベント レポート」を参照してください。
IWiaMiniDrv::drvDeleteItem 実装の説明
WIA アプリケーションが IWiaItem::D eleteItem メソッド (Microsoft Windows SDK ドキュメントで説明) を呼び出して WIA アイテムを削除すると、WIA サービスは IWiaMiniDrv::d rvDeleteItem メソッドを呼び出します。
WIA サービスは、このメソッドを呼び出す前に次のことを確認します。
項目はルート項目ではありません。
項目に子がありません。
アイテムのアクセス権は削除を許可します。
WIA サービスはこれらの条件を検証するため、WIA ドライバーもこれを行う必要はありません。
次のコード例は、 IWiaMiniDrv::d rvDeleteItem の実装を示しています。
HRESULT _stdcall CWIADevice::drvDeleteItem(BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if ((!pWiasContext) || (!plDevErrVal))
{
return E_INVALIDARG;
}
*plDevErrVal = 0;
HRESULT hr = S_OK;
//
// Two pieces of information are needed to queue an event:
// 1. Full item name
// 2. Device ID (passed in from drvInitializeWia,
// or read from the ROOT item's property set)
//
BSTR bstrFullItemName = NULL;
hr = wiasReadPropStr(pWiasContext,
WIA_IPA_FULL_ITEM_NAME,
&bstrFullItemName,NULL,TRUE);
if (hr == S_OK)
{
hr = HARDWARE_DELETE_DATA_FOR_ITEM();
if (hr == S_OK)
{
//
// Use m_bstrDeviceID cached from the
// drvInitializeWia method call.
//
hr = wiasQueueEvent(m_bstrDeviceID,
&WIA_EVENT_ITEM_DELETED,
bstrFullItemName);
}
//
// Free item's full item name, read above.
//
if (bstrFullItemName)
{
SysFreeString(bstrFullItemName);
bstrFullItemName = NULL;
}
}
//
// Returning S_OK will instruct the WIA service to remove the WIA
// item from the item tree. The WIA minidriver should only remove
// any associated data corresponding to the target item.
//
return hr;
}