アプリケーションによる WIA 項目のプロパティの読み取り
アプリケーションが WIA アイテム プロパティの読み取り要求を行うと、WIA サービスは IWiaMiniDrv::drvReadItemProperties メソッドを呼び出します。
IWiaMiniDrv::drvReadItemProperties メソッドは、次のタスクを実行する必要があります。
読み取り対象のプロパティが実行時の更新を必要とするかどうか判断します。 読み取り対象の WIA プロパティを特定するために、WIA ミニドライバーは PROPSPEC 配列 (Microsoft Windows SDK ドキュメンテーションで定義) を使用できます。 PROPSPEC 配列を処理する前に、WIA ミニドライバーがアイテムの種類を特定しておくことが推奨されます。 これにより、IWiaMiniDrv::drvReadItemProperties の呼び出しごとに配列を走査する必要がなくなります。 このデバイスの子アイテムに実行時のプロパティがない場合、ルート アイテム プロパティの読み取り要求のみが処理されます。
WIA プロパティの ID を使用し、wiasWriteMultiple または wiasWritePropXxx サービス関数を呼び出して 、現在の値を更新します。 これにより、ドライバー アイテムに格納されている WIA プロパティ セットが更新され、WIA サービスは新しい値をアプリケーションに返します。
WIA ミニドライバーがこの関数内で WIA プロパティに対して実行時の調整を行わない場合、WIA サービスはアプリケーションに対して現在の WIA プロパティの値のみを自動的に返します。 この関数は、デバイス クロックなどのプロパティ、またはドキュメント フィーダーの状態のように、ハードウェア固有のチェックが必要な WIA プロパティでのみ使用する必要があります。
IWiaMiniDrv::drvReadItemProperties の実装
IWiaMiniDrv::d rvReadItemProperties メソッドは、アプリケーションが WIA アイテムのプロパティを読み取ろうとしたときに呼び出されます。 WIA サービスは、まずこのメソッドを呼び出すことでドライバーに通知します。 WIA ドライバーは、読み取り対象のプロパティが正しいことを確認する必要があります。 デバイスの状態 (WIA_DPS_DOCUMENT_HANDLING_STATUS や、デバイスがクロック機能を持つ場合は WIA_DPA_DEVICE_TIME など) を必要とするプロパティについては、ここでハードウェアにアクセスするのが適切です。
WIA ドライバーがハードウェアと通信するのは稀な場合に限るべきであることに注意することが重要です。 この呼び出しでハードウェアと過剰に通信する WIA ドライバーは、応答性が悪く遅くなる印象を与えます。
次のコード例は IWiaMiniDrv::drvReadItemProperties メソッドの実装を示しています。
HRESULT _stdcall CWIADevice::drvReadItemProperties(
BYTE *pWiasContext,
LONG lFlags,
ULONG nPropSpec,
const PROPSPEC *pPropSpec,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if (!pWiasContext) {
return E_INVALIDARG;
}
if (!plDevErrVal) {
return E_INVALIDARG;
}
if (!pPropSpec) {
return E_INVALIDARG;
}
*plDevErrVal = 0;
LONG lWIAItemType = 0;
HRESULT hr = wiasGetItemType(pWiasContext,&lWIAItemType);
if(S_OK == hr) {
//
// perform custom operations depending on the type of
// WIA item that was passed to drvReadItemProperties
//
if(lWIAItemType & WiaItemTypeRoot) {
//
// If the WIA_DPA_CONNECT_STATUS property ID is in the PROPSPEC
// array, then read the latest "Connect Status".
// If it is NOT then do nothing. (skip access to the hardware)
//
// NOTE: only read properties contained in the PROPSPEC array
// from the hardware that need device updates.
// If the property in PROPSPEC does not need to be read
// from the hardware, or updated, do nothing. The WIA service
// will supply the caller with the current value in the
// the WIA property set.
//
BOOL bReadLatestConnectStatus = FALSE;
//
// traverse the WIA PROPSPEC array, looking for known WIA
// properties that require run-time updates, or needs to be
// updated with hardware access.
//
for(ULONG ulIndex = 0; ulIndex < nPropSpec; ulIndex++) {
//
// look for WIA property IDs that really need hardware
// access, or run-time adjusting.
//
if(pPropSpec[ulIndex].propid == WIA_DPA_CONNECT_STATUS) {
bReadLatestConnectStatus = TRUE;
}
}
//
// The item passed in is a ROOT item
//
if(bReadLatestConnectStatus) {
//
// WIA_DPA_CONNECT_STATUS should be updated from the
// hardware
//
LONG lConnectStatus = HARDWARE_READ_ConnectStatus();
//
// update WIA_DPA_CONNECT_STATUS property value using
// wiasWritePropLong (). The pWiasContext passed in
// already represents the current item to be written to.
//
hr = wiasWritePropLong(pWiasContext,WIA_DPA_CONNECT_STATUS,lConnectStatus);
if(S_OK == hr) {
//
// The WIA_DPA_CONNECT_STATUS property was successfully updated
//
} else {
//
// wiasWritePropLong() failed to write the WIA
// property. The WIA_DPA_CONNECT_STATUS
// property was NOT updated
//
}
}
} else {
//
// The item passed in is any other child item
//
}
} else {
//
// wiasGetItemType() failed to get the current item type
//
}
return hr;
}