Partager via


Modifier l’arborescence des éléments WIA

Un minidriver WIA a la possibilité de modifier l’arborescence des éléments WIA à tout moment. Lorsque le minidriver apporte une modification à l’arborescence d’éléments WIA, le minidriver doit avertir le service WIA. Le service WIA avertit ensuite toutes les applications WIA connectées. Une fois la notification reçue, l’application WIA doit énumérer l’arborescence d’éléments WIA pour déterminer le résultat des modifications.

Un minidriver utilise la fonction d’utilitaire de service WIA, wiasQueueEvent, pour communiquer les modifications de l’arborescence au service WIA. Un minidriver WIA peut mettre en file d’attente uniquement les événements signalés dans IWiaMiniDrv ::d rvGetCapabilities. Pour plus d’informations sur la création de rapports d’événements WIA, consultez Rapports d’événements.

Explication de l’implémentation IWiaMiniDrv ::d rvDeleteItem

Le service WIA appelle la méthode IWiaMiniDrv ::d rvDeleteItem lorsqu’une application WIA appelle la méthode IWiaItem ::D eleteItem (décrite dans la documentation Microsoft Windows SDK) pour supprimer un élément WIA.

Le service WIA vérifie ce qui suit avant d’appeler cette méthode :

  • L’élément n’est pas un élément racine.

  • L’élément n’a pas d’enfants.

  • Les droits d’accès de l’élément autorisent la suppression.

Étant donné que le service WIA vérifie ces critères, il n’est pas nécessaire que le pilote WIA le fasse également.

L’exemple de code suivant montre une implémentation 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;
}