Freigeben über


Ändern der STRUKTUR des WIA-Elements

Ein WIA-Minitreiber kann die STRUKTUR der WIA-Elementstruktur jederzeit ändern. Wenn der Minitreiber eine Änderung an der WIA-Elementstruktur vornimmt, muss der Minitreiber den WIA-Dienst benachrichtigen. Der WIA-Dienst benachrichtigt dann alle verbundenen WIA-Anwendungen. Nachdem die Benachrichtigung empfangen wurde, muss die WIA-Anwendung die WIA-Elementstruktur aufzählen, um das Ergebnis von Änderungen zu ermitteln.

Ein Minidriver verwendet die WIA-Dienst-Hilfsprogrammfunktion wiasQueueEvent, um Änderungen in der Struktur an den WIA-Dienst zu kommunizieren. Ein WIA-Minitreiber kann nur die Ereignisse in die Warteschlange stellen, die in IWiaMiniDrv::d rvGetCapabilities gemeldet wurden. Weitere Informationen zum Melden von WIA-Ereignissen finden Sie unter Ereignisberichterstattung.

Erläuterung der IWiaMiniDrv::d rvDeleteItem-Implementierung

Der WIA-Dienst ruft die IWiaMiniDrv::d rvDeleteItem-Methode auf, wenn eine WIA-Anwendung die IWiaItem::D eleteItem-Methode aufruft (in der Microsoft Windows SDK-Dokumentation beschrieben), um ein WIA-Element zu löschen.

Der WIA-Dienst überprüft Folgendes, bevor diese Methode aufgerufen wird:

  • Das Element ist kein Stammelement.

  • Das Element hat keine untergeordneten Elemente.

  • Die Zugriffsrechte des Elements lassen das Löschen zu.

Da der WIA-Dienst diese Kriterien überprüft, ist es nicht erforderlich, dass der WIA-Treiber dies ebenfalls tun muss.

Das folgende Codebeispiel zeigt eine Implementierung von 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;
}