ポーリング イベントのサポートを追加する
ポーリング イベントを報告するように WIA ドライバーを適切に設定するには、次の操作を行います。
デバイスの INF ファイルで Capabilities=0x33 を設定します。 ( 詳細については WIA デバイス 用の INF ファイル をご確認ください。)
IStiUSD::GetCapabilities メソッドで STI_GENCAP_NOTIFICATIONS とSTI_USD_GENCAP_NATIVE_PUSHSUPPORT を報告します。
IWiaMiniDrv::drvGetCapabilities メソッドでサポートされているすべてのイベントを報告します。
IStiUSD::GetStatus メソッドの呼び出しに応答します。 WIA サービスは、INF ファイルで構成可能な事前設定された間隔でこのメソッドを呼び出します。 デフォルト設定は 1 秒間隔です。
IStiUSD::GetNotificationData メソッドで 適切なイベント情報応答を報告します。
WIA サービスは、次の 2 つの主要な操作に対して 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 に設定する必要があります。 m_guidLastEvent は、WIA サービスが IStiUSD::GetNotificationData メソッドを呼び出すときに後でチェックされます。 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;
}