다음을 통해 공유


폴링 이벤트 지원 추가

폴링 이벤트를 보고하도록 WIA 드라이버를 올바르게 설정하려면 다음을 수행합니다.

  1. 디바이스의 INF 파일에서 Capabilities=0x33 설정합니다. 자세한 내용은 WIA 디바이스용 INF 파일을 참조하세요 .

  2. IStiUSD::GetCapabilities 메서드의 보고서 STI_GENCAP_NOTIFICATIONS 및 STI_USD_GENCAP_NATIVE_PUSHSUPPORT.

  3. IWiaMiniDrv::d rvGetCapabilities 메서드에서 지원되는 모든 이벤트를 보고합니다.

  4. IStiUSD::GetStatus 메서드에 대한 호출에 응답합니다. WIA 서비스는 INF 파일에서 구성할 수 있는 미리 설정된 간격으로 이 메서드를 호출합니다. 기본 설정은 1초 간격입니다.

  5. IStiUSD::GetNotificationData 메서드에서 적절한 이벤트 정보 응답을 보고합니다.

WIA 서비스는 두 가지 주요 작업에 대해 IStiUSD::GetStatus 메서드를 호출합니다.

  1. 디바이스의 온라인 상태 확인합니다.

  2. 푸시 단추 이벤트와 같은 디바이스 이벤트에 대한 폴링

작업 요청 확인은 STI_DEVICE_STATUS 구조체의 StatusMask 멤버를 확인하여 수행할 수 있습니다. StatusMask 멤버는 다음 요청 중 하나일 수 있습니다.

STI_DEVSTATUS_ONLINE_STATE
이 작업 요청은 디바이스가 온라인 상태인지 확인하고 STI_DEVICE_STATUS 구조의 dwOnlinesState 멤버를 설정하여 채워야 합니다.

STI_DEVSTATUS_EVENTS_STATE
이 작업 요청은 디바이스 이벤트를 확인합니다. STI_DEVICE_STATUS 구조체의 dwEventHandlingState 멤버를 설정하여 채워야 합니다. 사용해야 하는 값은 STI_EVENTHANDLING_PENDING. (디바이스에 보류 중인 이벤트가 있으며 WIA 서비스에 보고하기 위해 대기 중입니다.)

STI_EVENTHANDLING_PENDING 설정되면 WIA 서비스에서 WIA 드라이버에서 이벤트가 발생했음을 알리는 신호가 표시됩니다. WIA 서비스는 IStiUSD::GetNotificationData 메서드를 호출하여 이벤트에 대한 자세한 정보를 가져옵니다.

폴링된 이벤트 및 인터럽트 이벤트에 대해 IStiUSD::GetNotificationData 메서드가 호출됩니다. WIA 서비스로 돌아가려면 적절한 이벤트 정보를 입력해야 합니다.

참고 항상 dwEventHandlingState 멤버의 STI_EVENTHANDLING_PENDING 플래그를 지우고 디바이스 이벤트가 발생할 때 올바르게 설정되었는지 확인합니다. 이 WIA 드라이버는 이벤트가 감지될 때 m_guidLastEvent 클래스 멤버 변수를 적절한 이벤트 GUID로 설정해야 합니다. WIA 서비스가 IStiUSD::GetNotificationData 메서드를 호출하면 나중에 m_guidLastEvent 확인됩니다. m_guidLastEvent 멤버 변수는 신호를 받은 마지막 이벤트를 캐시하는 데 사용되는 CWIADevice 클래스(다음 코드 조각)에 정의됩니다. WIA 서비스에서 이 멤버 변수를 요청한 후에는 항상 GUID_NULL 로 설정됩니다.

다음 예제에서는 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;
}