項目ツリーの変更をアプリケーションに通知
WIA デバイスのミニドライバーは、デバイスの項目ツリーへの変更を WIA デバイスに関連付けられているアプリケーションに通知できる必要があります。 たとえば、アプリケーションがカメラに画像のサムネイルを表示するユーザー インターフェイスを表示する場合、ユーザーが既に削除した画像のサムネイルを表示しないよう WIA ミニドライバーがアプリケーションのユーザー インターフェイスに通知できる必要があります。
次の IWiaMiniDrv::d rvDeviceCommand メソッドの実装例は、WIA ミニドライバーが WIA サービスによって送信されたコマンドに応答し、デバイスにコマンドを渡す方法を示しています。 WIA ミニドライバーがデバイスにコマンドを発行した後、デバイス項目ツリーが変更されたことをミニドライバーがアプリケーションに通知します。 この実装では、WIA サービスが "Take Picture" コマンド (WIA_CMD_TAKE_PICTURE) を発行したことをメソッドにより判断します。 このメソッドは、ルート項目 (デバイスの項目) で TakePicture メソッドを呼び出し、項目ツリーに新しい画像が含まれていることを接続されているアプリケーションに通知します。 (WIA_CMD_TAKE_PICTURE と TakePicture については、Microsoft Windows SDK のドキュメントを参照してください。) ミニドライバーは、wiasQueueEvent 関数を呼び出すことによってこれを行います。
ミニドライバーがツリーが更新されたことを示すイベントを送信すると、呼び出し元だけでなく、すべてのリッスンしているアプリケーションに変更が通知されます。 たとえば、ユーザーがカメラのエクスプローラービューを開き、Microsoft ペイントにより新しい画像を取得した場合、該当イベントをリッスンしているため新しい画像が到着したときにもエクスプローラー ウィンドウに表示されます。
次のコード例は、IWiaMiniDrv::drvDeviceCommand メソッドの実装を示しています。
HRESULT _stdcall CWIADevice::drvDeviceCommand(
BYTE *pWiasContext,
LONG lFlags,
const GUID *plCommand,
IWiaDrvItem **ppWiaDrvItem,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call and return E_INVALIDARG.
//
if ((!pWiasContext)||(!plDevErrVal)||(!plCommand)) {
return E_INVALIDARG;
}
*plDevErrVal = 0;
HRESULT hr = E_NOTIMPL;
//
// Check which command was issued
//
if (*plCommand == WIA_CMD_TAKE_PICTURE) {
//
// process command here
//
hr = HARDWARE_SNAP_PHOTO();
}
return hr;
}