Ändern der STRUKTUR des WIA-Elements
Ein WIA-Minitreiber kann die STRUKTUR der WIA-Elementstruktur jederzeit ändern. Wenn der Minitreiber eine Änderung an der WIA-Elementstruktur vornimmt, muss der Minitreiber den WIA-Dienst benachrichtigen. Der WIA-Dienst benachrichtigt dann alle verbundenen WIA-Anwendungen. Nachdem die Benachrichtigung empfangen wurde, muss die WIA-Anwendung die WIA-Elementstruktur aufzählen, um das Ergebnis von Änderungen zu ermitteln.
Ein Minidriver verwendet die WIA-Dienst-Hilfsprogrammfunktion wiasQueueEvent, um Änderungen in der Struktur an den WIA-Dienst zu kommunizieren. Ein WIA-Minitreiber kann nur die Ereignisse in die Warteschlange stellen, die in IWiaMiniDrv::d rvGetCapabilities gemeldet wurden. Weitere Informationen zum Melden von WIA-Ereignissen finden Sie unter Ereignisberichterstattung.
Erläuterung der IWiaMiniDrv::d rvDeleteItem-Implementierung
Der WIA-Dienst ruft die IWiaMiniDrv::d rvDeleteItem-Methode auf, wenn eine WIA-Anwendung die IWiaItem::D eleteItem-Methode aufruft (in der Microsoft Windows SDK-Dokumentation beschrieben), um ein WIA-Element zu löschen.
Der WIA-Dienst überprüft Folgendes, bevor diese Methode aufgerufen wird:
Das Element ist kein Stammelement.
Das Element hat keine untergeordneten Elemente.
Die Zugriffsrechte des Elements lassen das Löschen zu.
Da der WIA-Dienst diese Kriterien überprüft, ist es nicht erforderlich, dass der WIA-Treiber dies ebenfalls tun muss.
Das folgende Codebeispiel zeigt eine Implementierung von 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;
}