Partilhar via


Alterar a estrutura da árvore de itens WIA

Um minidriver WIA tem a capacidade de alterar a estrutura da árvore de itens WIA a qualquer momento. Quando o minidriver faz uma alteração na árvore de itens WIA, o minidriver deve notificar o serviço WIA. Em seguida, o serviço WIA notifica todos os aplicativos WIA conectados. Depois que a notificação for recebida, o aplicativo WIA deverá enumerar a árvore de itens WIA para determinar o resultado de quaisquer alterações.

Um minidriver usa a função de utilitário de serviço WIA, wiasQueueEvent, para comunicar alterações na estrutura de árvore para o serviço WIA. Um minidriver WIA pode enfileirar somente os eventos que foram relatados em IWiaMiniDrv::d rvGetCapabilities. Para obter mais informações sobre como relatar eventos WIA, consulte Relatórios de eventos.

Explicação da implementação IWiaMiniDrv::d rvDeleteItem

O serviço WIA chama o método IWiaMiniDrv::d rvDeleteItem quando um aplicativo WIA chama o método IWiaItem::D eleteItem (descrito na documentação do SDK do Microsoft Windows) para excluir um item WIA.

O serviço WIA verifica o seguinte antes de chamar este método:

  • O item não é um item raiz.

  • O item não tem filhos.

  • Os direitos de acesso do item permitem a exclusão.

Como o serviço WIA verifica esses critérios, não é necessário que o driver WIA faça isso também.

O exemplo de código a seguir mostra uma implementação 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;
}