Delen via


Ondersteuning voor polling-gebeurtenissen toevoegen

Volg deze stappen om uw WIA-stuurprogramma goed in te stellen om polling-gebeurtenissen te rapporteren:

  1. Mogelijkheden =0x33 instellen in het INF-bestand van uw apparaat. (Zie INF-bestanden voor WIA-apparaten voor meer informatie.)

  2. Rapport STI_GENCAP_NOTIFICATIONS en STI_USD_GENCAP_NATIVE_PUSHSUPPORT in de methode IStiUSD::GetCapabilities.

  3. Alle ondersteunde gebeurtenissen rapporteren in de methode IWiaMiniDrv::drvGetCapabilities.

  4. Reageer op oproepen naar de methode IStiUSD::GetStatus. De WIA-service roept deze methode aan met een vooraf ingesteld interval dat kan worden geconfigureerd in het INF-bestand. De standaardinstelling is een interval van 1 seconde.

  5. Rapporteer de juiste reactie op gebeurtenisinformatie in de methode IStiUSD::GetNotificationData.

De WIA-service roept de methode IStiUSD::GetStatus voor twee belangrijke bewerkingen:

  1. De onlinestatus van het apparaat controleren.

  2. Polling voor apparaatgebeurtenissen, zoals een drukknopgebeurtenis.

Het bepalen van de bewerkingsaanvraag kan worden uitgevoerd door het lid StatusMask van de STI_DEVICE_STATUS-structuur te controleren. Het member StatusMask kan een van de volgende verzoeken zijn:

STI_DEVSTATUS_ONLINE_STATE
Met deze bewerkingsaanvraag wordt gecontroleerd of het apparaat online is en moet worden ingevuld door het lid dwOnlinesState van de STI_DEVICE_STATUS-structuur in te stellen.

STI_DEVSTATUS_EVENTS_STATE
Met deze bewerkingsaanvraag wordt gecontroleerd op apparaat gebeurtenissen. Deze moet worden ingevuld door het lid dwEventHandlingState van de STI_DEVICE_STATUS-structuur in te stellen. De waarde die moet worden gebruikt, is STI_EVENTHANDLING_PENDING. (Er is een gebeurtenis in behandeling op het apparaat en er wordt gewacht om deze aan de WIA-service te rapporteren.)

Wanneer STI_EVENTHANDLING_PENDING is ingesteld, wordt de WIA-service ervan op de hoogte gesteld dat er een gebeurtenis in het WIA-stuurprogramma heeft plaatsgevonden. De WIA-service roept de IStiUSD::GetNotificationData methode aan voor meer informatie over de gebeurtenis.

De methode IStiUSD::GetNotificationData wordt aangeroepen voor polled gebeurtenissen en interrupt gebeurtenissen. Het is in deze methode dat u de juiste gebeurtenisgegevens moet invullen om terug te keren naar de WIA-service.

Let op Wis altijd de vlag STI_EVENTHANDLING_PENDING in het lid dwEventHandlingState om ervoor te zorgen dat deze juist is ingesteld wanneer een apparaatgebeurtenis plaatsvindt. Dit WIA-stuurprogramma moet de variabele m_guidLastEvent klasselid instellen op de juiste gebeurtenis-GUID wanneer een gebeurtenis wordt gedetecteerd. De m_guidLastEvent wordt op een later tijdstip gecontroleerd wanneer de WIA-service de methode IStiOPGEGEVEN::GetNotificationData aanroept. De m_guidLastEvent lidvariabele is gedefinieerd in de klasse CWIADevice (in het volgende codefragment) en wordt gebruikt om de laatste gesignaleerde gebeurtenis in de cache op te slaan. Nadat deze lidvariabele is aangevraagd door de WIA-service, is deze altijd ingesteld op GUID_NULL.

In het volgende voorbeeld ziet u een implementatie van de methode IStiUSD::GetStatus.

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