폴링 이벤트 지원 추가
폴링 이벤트를 보고하도록 WIA 드라이버를 올바르게 설정하려면 다음을 수행합니다.
디바이스의 INF 파일에서 Capabilities=0x33 설정합니다. 자세한 내용은 WIA 디바이스용 INF 파일을 참조하세요 .
IStiUSD::GetCapabilities 메서드의 보고서 STI_GENCAP_NOTIFICATIONS 및 STI_USD_GENCAP_NATIVE_PUSHSUPPORT.
IWiaMiniDrv::d rvGetCapabilities 메서드에서 지원되는 모든 이벤트를 보고합니다.
IStiUSD::GetStatus 메서드에 대한 호출에 응답합니다. WIA 서비스는 INF 파일에서 구성할 수 있는 미리 설정된 간격으로 이 메서드를 호출합니다. 기본 설정은 1초 간격입니다.
IStiUSD::GetNotificationData 메서드에서 적절한 이벤트 정보 응답을 보고합니다.
WIA 서비스는 두 가지 주요 작업에 대해 IStiUSD::GetStatus 메서드를 호출합니다.
디바이스의 온라인 상태 확인합니다.
푸시 단추 이벤트와 같은 디바이스 이벤트에 대한 폴링
작업 요청 확인은 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;
}