WIA プロパティ設定をハードウェアへ適用する
WIA アプリケーションがデータ転送を開始すると、WIA サービスは、WIA ミニドライバーに現在の WIA プロパティ設定を適用し、デバイス固有の設定をハードウェアに適用する機会を提供します。 WIA サービスは IWiaMiniDrv::drvWriteItemProperties メソッドを呼び出してから、 IWiaMiniDrv::drvAcquireItemData メソッドを呼び出します。 後者のメソッドは、WIA アプリケーションがデータ転送を開始する場合にのみ呼び出されます。 WIA ミニドライバーは、WIA サービス関数を使用して、独自のドライバー項目ツリーのプロパティを読み取る必要があります。
IWiaMiniDrv::drvWriteItemProperties を実装する
WIA サービスは、クライアントがデータ転送を要求した後、 IWiaMiniDrv::drvWriteItemProperties メソッドを呼び出します。 WIA サービスは IWiaMiniDrv::drvAcquireItemData の呼び出しを行う前に、このメソッドを呼び出します。 WIA ミニドライバーは、このメソッドから戻る前に、ハードウェアに必要な設定をコミットする必要があります。
このメソッドが呼び出されると、WIA ミニドライバーはデータ転送の実行にコミットされています。 WIA サービスは、現時点で WIA_ERROR_BUSY エラー コードを使用してデータを取得しようとするアプリケーションに失敗します。
次のコード例は IWiaMiniDrv::drvValidateItemProperties メソッドの実装を示しています。
HRESULT _stdcall CWIADevice::drvWriteItemProperties(
BYTE *pWiasContext,
LONG lFlags,
PMINIDRV_TRANSFER_CONTEXT pmdtc,
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 (!pmdtc) {
return E_INVALIDARG;
}
if (!plDevErrVal) {
return E_INVALIDARG;
}
HRESULT hr = S_OK;
*plDevErrVal = 0;
PROPVARIANT pv[2];
PROPSPEC ps[2] = {
{PRSPEC_PROPID, WIA_IPS_XRES},
{PRSPEC_PROPID, WIA_IPS_YRES}
};
//
// initialize propvariant structures
//
pv[0].vt = VT_I4; // X resolution is a LONG value
pv[1].vt = VT_I4; // Y resolution is a LONG value
//
// read 2 WIA item properties (X and Y resolution)
//
hr = wiasReadMultiple(pWiasContext, 2, ps, pv, NULL);
if (hr == S_OK) {
//
// write current X and Y resolution values, read from the
// the WIA property set, and write them to the device.
//
hr = SetMyDeviceXResolution(pv[0].lVal);
if(S_OK == hr) {
hr = SetMyDeviceYResolution(pv[1].lVal);
if(FAILED(hr)) {
//
// could not set Y resolution to device
//
}
} else {
//
// could not set X resolution to device
//
}
}
return hr;
}