Поделиться через


Изменение структуры дерева элементов WIA

Мини-накопитель WIA может в любое время изменять структуру дерева элементов WIA. Когда мини-диск вносит изменения в дерево элементов WIA, он должен уведомить службу WIA. Затем служба WIA уведомляет все подключенные приложения WIA. После получения уведомления приложение WIA должно перечислить дерево элементов WIA, чтобы определить результат любых изменений.

Мини-накопитель использует служебную служебную функцию WIA wiasQueueEvent для передачи изменений в древовидной структуре в службу WIA. Мини-накопитель WIA может ставить в очередь только те события, о которых сообщалось в IWiaMiniDrv::d rvGetCapabilities. Дополнительные сведения о отчетах о событиях WIA см. в разделе Отчеты о событиях.

Объяснение реализации IWiaMiniDrv::d rvDeleteItem

Служба WIA вызывает метод IWiaMiniDrv::d rvDeleteItem, когда приложение WIA вызывает метод IWiaItem::D eleteItem (описанный в документации по Microsoft Windows SDK) для удаления элемента WIA.

Перед вызовом этого метода служба 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;
}