Freigeben über


Unterstützung für Abrufereignisse hinzufügen

Gehen Sie wie folgt vor, um Ihren WIA-Treiber ordnungsgemäß für die Meldung von Abrufereignissen einzurichten:

  1. Legen Sie Capabilities=0x33 in der INF-Datei Ihres Geräts fest. (Weitere Informationen finden Sie unter INF-Dateien für WIA-Geräte .)

  2. Melden Sie STI_GENCAP_NOTIFICATIONS und STI_USD_GENCAP_NATIVE_PUSHSUPPORT in der IStiUSD::GetCapabilities-Methode .

  3. Melden Sie alle unterstützten Ereignisse in der IWiaMiniDrv::d rvGetCapabilities-Methode .

  4. 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.

  5. Melden Sie die richtige Ereignisinformationsantwort in der IStiUSD::GetNotificationData-Methode .

Der WIA-Dienst ruft die IStiUSD::GetStatus-Methode für zwei Hauptvorgänge auf:

  1. Überprüfen der Online-status des Geräts.

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