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;
}