Unterstützung für Abrufereignisse hinzufügen
Gehen Sie wie folgt vor, um Ihren WIA-Treiber ordnungsgemäß für die Meldung von Abrufereignissen einzurichten:
Legen Sie Capabilities=0x33 in der INF-Datei Ihres Geräts fest. (Weitere Informationen finden Sie unter INF-Dateien für WIA-Geräte .)
Melden Sie STI_GENCAP_NOTIFICATIONS und STI_USD_GENCAP_NATIVE_PUSHSUPPORT in der IStiUSD::GetCapabilities-Methode .
Melden Sie alle unterstützten Ereignisse in der IWiaMiniDrv::d rvGetCapabilities-Methode .
Antworten auf Aufrufe der IStiUSD::GetStatus-Methode . Der WIA-Dienst ruft diese Methode in einem voreingestellten Intervall auf, das in der INF-Datei konfigurierbar ist. Die Standardeinstellung ist ein Intervall von 1 Sekunde.
Melden Sie die richtige Ereignisinformationsantwort in der IStiUSD::GetNotificationData-Methode .
Der WIA-Dienst ruft die IStiUSD::GetStatus-Methode für zwei Hauptvorgänge auf:
Überprüfen der Online-status des Geräts.
Abrufen von Geräteereignissen, z. B. einem Push-Button-Ereignis.
Die Ermittlung der Vorgangsanforderung kann durch Überprüfen des StatusMask-Elements der STI_DEVICE_STATUS-Struktur erfolgen. Das StatusMask-Element kann eine der folgenden Anforderungen sein:
STI_DEVSTATUS_ONLINE_STATE
Diese Vorgangsanforderung überprüft, ob das Gerät online ist und gefüllt werden soll, indem der dwOnlinesState-Member der STI_DEVICE_STATUS-Struktur festgelegt wird.
STI_DEVSTATUS_EVENTS_STATE
Diese Vorgangsanforderung überprüft auf Geräteereignisse. Sie sollte durch Festlegen des dwEventHandlingState-Elements der STI_DEVICE_STATUS-Struktur gefüllt werden. Der Wert, der verwendet werden soll, ist STI_EVENTHANDLING_PENDING. (Das Gerät hat ein Ereignis ausstehend und wartet darauf, es an den WIA-Dienst zu melden.)
Wenn STI_EVENTHANDLING_PENDING festgelegt ist, wird dem WIA-Dienst signalisiert, dass im WIA-Treiber ein Ereignis aufgetreten ist. Der WIA-Dienst ruft die IStiUSD::GetNotificationData-Methode auf, um weitere Informationen zum Ereignis zu erhalten.
Die IStiUSD::GetNotificationData-Methode wird für Abruf- und Unterbrechungsereignisse aufgerufen. In dieser Methode sollten Sie die richtigen Ereignisinformationen eingeben, um an den WIA-Dienst zurückzukehren.
Hinweis Deaktivieren Sie immer das flag STI_EVENTHANDLING_PENDING im dwEventHandlingState-Element , um sicherzustellen, dass es ordnungsgemäß festgelegt ist, wenn ein Geräteereignis auftritt. Dieser WIA-Treiber sollte die m_guidLastEvent Klassenmembervariable auf die richtige Ereignis-GUID festlegen, wenn ein Ereignis erkannt wird. Die m_guidLastEvent wird zu einem späteren Zeitpunkt überprüft, wenn der WIA-Dienst die IStiUSD::GetNotificationData-Methode aufruft . Die m_guidLastEvent Membervariable wird in der CWIADevice-Klasse (im folgenden Codeausschnitt) definiert, die zum Zwischenspeichern des letzten Signalereignisses verwendet wird. Nachdem diese Membervariable vom WIA-Dienst angefordert wurde, wird sie immer auf GUID_NULL festgelegt.
Das folgende Beispiel zeigt eine Implementierung der IStiUSD::GetStatus-Methode .
STDMETHODIMP CWIADevice::GetStatus(PSTI_DEVICE_STATUS pDevStatus)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if(!pDevStatus)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
//
// If we are asked, verify state of an event handler
//(front panel buttons, user controlled attachments, etc.).
//
// If your device requires polling, then this is where you would
// specify the event result.
// However, It is not recommended to have polled events.
// Interrupt events are better for performance, and reliability.
// See the SetNotificationsHandle method for how to
// implement interrupt events.
//
//
// clear the dwEventHandlingState field first to make sure we are really setting
// a pending event.
//
pDevStatus->dwEventHandlingState &= ~STI_EVENTHANDLING_PENDING;
if (pDevStatus->StatusMask & STI_DEVSTATUS_EVENTS_STATE) {
//
// set the polled event result here, for the GetNotificationData()
// method to read and report.
// (m_guidLastEvent will be read in GetNotificationData)
//
LONG lEventResult = 0;
PollMyDeviceForEvents(&lEventResult)
if(lEventResult == DEVICE_SCAN_BUTTON_PRESSED) {
//
// polled event result was one we know about
//
m_guidLastEvent = WIA_EVENT_SCAN_IMAGE;
} else {
//
// nothing happened, so continue
//
m_guidLastEvent = GUID_NULL;
}
if (m_guidLastEvent != GUID_NULL) {
//
// if the event GUID is NOT GUID_NULL, set the
// STI_EVENTHANDLING_PENDING flag letting the WIA service
// know that we have an event ready. This will tell the WIA
// service to call GetNotificationData() for the event
// specific information.
//
pDevStatus->dwEventHandlingState |= STI_EVENTHANDLING_PENDING;
}
}
return S_OK;
}