Condividi tramite


Modificare la struttura dell'albero degli elementi WIA

Un minidriver WIA ha la possibilità di modificare la struttura dell'albero degli elementi WIA in qualsiasi momento. Quando il minidriver apporta una modifica all'albero degli elementi WIA, il minidriver deve inviare una notifica al servizio WiA. Il servizio WIA invia quindi una notifica a tutte le applicazioni WIA connesse. Dopo la ricezione della notifica, l'applicazione WIA deve enumerare l'albero degli elementi WIA per determinare il risultato di eventuali modifiche.

Un minidriver usa la funzione dell'utilità del servizio WIA, wiasQueueEvent, per comunicare le modifiche nella struttura ad albero al servizio WIA. Un minidriver WIA può accodare solo gli eventi segnalati in IWiaMiniDrv::d rvGetCapabilities. Per altre informazioni sulla creazione di report degli eventi WIA, vedere Segnalazione eventi.

Spiegazione dell'implementazione di IWiaMiniDrv::d rvDeleteItem

Il servizio WIA chiama il metodo IWiaMiniDrv::d rvDeleteItem quando un'applicazione WIA chiama il metodo IWiaItem::D eleteItem (descritto nella documentazione di Microsoft Windows SDK) per eliminare un elemento WIA.

Il servizio WIA verifica quanto segue prima di chiamare questo metodo:

  • L'elemento non è un elemento radice.

  • L'elemento non ha elementi figlio.

  • I diritti di accesso dell'elemento consentono l'eliminazione.

Poiché il servizio WIA verifica questi criteri, non è necessario che anche il driver WIA lo faccia.

L'esempio di codice seguente illustra un'implementazione di 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;
}