次の方法で共有


WIA 項目のツリー構造の変更

WIA ミニドライバーは、WIA 項目ツリー構造をいつでも変更することができます。 ミニドライバーが WIA 項目ツリーに変更を加えるとき、ミニドライバーは WIA サービスに通知する必要があります。 WIA サービスは、接続されたすべての WIA アプリケーションに通知します。 通知を受け取った後、WIA アプリケーションは、変更の結果を決定する WIA 項目ツリーを列挙する必要があります。

ミニドライバーは WIA サービス ユーティリティ関数 wiasQueueEvent を使用して、ツリー構造の変更を WIA サービスに伝達します。 WIA ミニドライバーは、IWiaMiniDrv::drvGetCapabilities で報告されたイベントのみキューに登録できます。 WIA イベントの報告について詳しくは、「イベントのレポート」をご覧ください。

IWiaMiniDrv::drvDeleteItem 実装の説明

WIA アプリケーションが IWiaItem::DeleteItem メソッド (Microsoft Windows SDK ドキュメントで説明されています) を呼び出して WIA アイテムを削除すると、WIA サービスは IWiaMiniDrv::drvDeleteItem メソッドを呼び出します。

WIA サービスは、このメソッドを呼び出す前に以下のことを確認します。

  • 項目がルート項目ではない。

  • 項目に子がない。

  • 項目のアクセス権で削除を許可されている。

WIA サービスはこれらの条件を検証するため、WIA ドライバーもこれを行う必要はありません。

以下のコード例は、IWiaMiniDrv::drvDeleteItem の実装を示しています。

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