Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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;
}