Udostępnij przez


Zmienianie struktury drzewa elementów WIA

Minidriver WIA ma możliwość zmiany struktury drzewa elementów WIA w dowolnym momencie. Gdy minidriver wprowadza zmianę w drzewie elementów WIA, minidriver musi powiadomić usługę WIA. Następnie usługa WIA powiadamia wszystkie połączone aplikacje WIA. Po odebraniu powiadomienia aplikacja WIA musi wyliczyć drzewo elementów WIA, aby określić wynik wszelkich zmian.

Minidriver używa funkcji narzędzia usługi WIA, wiasQueueEvent, do przekazywania zmian w strukturze drzewa do usługi WIA. Minidriver WIA może ustawiać w kolejce jedynie te zdarzenia, które zostały zgłoszone w IWiaMiniDrv::drvGetCapabilities. Aby uzyskać więcej informacji na temat raportowania zdarzeń WIA, zobacz Raportowanie zdarzeń.

Wyjaśnienie implementacji IWiaMiniDrv::drvDeleteItem

Usługa WIA wywołuje metodę IWiaMiniDrv::drvDeleteItem, gdy aplikacja WIA wywołuje metodę IWiaItem::DeleteItem (opisaną w dokumentacji zestawu Microsoft Windows SDK) w celu usunięcia elementu WIA.

Usługa WIA sprawdza następujące elementy przed wywołaniem tej metody:

  • Element nie jest elementem bazowym.

  • Element nie ma elementów podrzędnych.

  • Prawa dostępu do elementu umożliwiają usunięcie.

Ponieważ usługa WIA sprawdza te kryteria, nie jest również konieczne, aby sterownik WIA to zrobił.

Poniższy przykład kodu przedstawia implementację 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;
}