Compartir a través de


Cambiar la estructura del árbol de elementos WIA

Un minidriver WIA tiene la capacidad de cambiar la estructura del árbol de elementos WIA en cualquier momento. Cuando el minidriver realiza un cambio en el árbol de elementos WIA, el minidriver debe notificar al servicio WIA. A continuación, el servicio WIA notifica a todas las aplicaciones WIA conectadas. Una vez recibida la notificación, la aplicación WIA debe enumerar el árbol de elementos WIA para determinar el resultado de los cambios.

Un minidriver usa la función de utilidad de servicio WIA, wiasQueueEvent, para comunicar los cambios en la estructura de árbol al servicio WIA. Un minidriver WIA solo puede poner en cola los eventos notificados en IWiaMiniDrv::d rvGetCapabilities. Para obtener más información sobre cómo informar de eventos WIA, consulte Informes de eventos.

Explicación de la implementación de IWiaMiniDrv::d rvDeleteItem

El servicio WIA llama al método IWiaMiniDrv::d rvDeleteItem cuando una aplicación WIA llama al método IWiaItem::D eleteItem (descrito en la documentación de Microsoft Windows SDK) para eliminar un elemento WIA.

El servicio WIA comprueba lo siguiente antes de llamar a este método:

  • El elemento no es un elemento raíz.

  • El elemento no tiene elementos secundarios.

  • Los derechos de acceso del elemento permiten la eliminación.

Dado que el servicio WIA comprueba estos criterios, no es necesario que el controlador WIA también lo haga.

En el ejemplo de código siguiente se muestra una implementación de 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;
}