ドライバーによる WIA プロパティの書き込み
WIA ミニドライバーは、次の WIA サービス関数を使用して、WIA プロパティの現在の値と有効な値のいずれかを更新できます。
wiasWriteMultiple
すべての WIA プロパティ型を書き込みます。 これは、WIA ドライバーが、カスタム プロパティを含む、WIA 項目に既存のプロパティを書き込むを許可する一般的な関数です。 呼び出しごとに複数のプロパティに書き込む場合に使用できます。
wiasWritePropStr
文字列 (型VT_BSTR) である WIA プロパティを書き込みます。
wiasWritePropLong
4 バイト整数 (VT_I4 型) である WIA プロパティを書き込みます。
wiasWritePropFloat
4 バイト実数 (VT_R4 型) である WIA プロパティを書き込みます。
wiasWritePropGuid
GUID である WIA プロパティを書き込みます (VT_CLSID型)。
wiasWritePropBin
符号なしバイトの文字列である WIA プロパティを書き込む (型 VT_VECTOR |VT_UI1)。
wiasGetChangedValueLong
4 バイト整数 (型VT_I4) である WIA プロパティの現在の変更された情報を取得します。
wiasGetChangedValueFloat
4 バイト実数 (型VT_R4) である WIA プロパティの現在の変更された情報を取得します。
wiasGetChangedValueGuid
GUID (種類VT_CLSID) である WIA プロパティの現在の変更された情報を取得します。
wiasGetChangedValueStr
文字列 (型VT_BSTR) である WIA プロパティの現在の変更された情報を取得します。
wiasCreatePropContext
wiasGetChangedValueLong、wiasGetChangedValueFloat、wiasGetChangedValueGuid、wiasGetChangedValueStr サービス関数で使用される WIA プロパティ コンテキストを作成します。
wiasFreePropContext
wiasCreatePropContext によって 作成された割り当てられたコンテキスト メモリを解放します。
IWiaMiniDrv::drvValidateItemProperties の実装
IWiaMiniDrv::drvValidateItemProperties メソッドは、項目の WIA プロパティに変更が加えられたときに呼び出されます。 WIA ミニドライバーは、値が有効であることをチェックするだけでなく、変更された有効な値を更新する必要があります。
WIA プロパティが無効で、アプリケーションがそのプロパティに書き込みを行っていない場合は、無効な値および依存する値を有効な値に変更する必要があります。そうしないと、検証に失敗します (アプリケーションがプロパティを無効な値に設定しているため)。
次のコード例は、IWiaMiniDrv::drvValidateItemProperties メソッドの実装を示しています。
HRESULT _stdcall CWIADevice::drvValidateItemProperties(
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;
}
HRESULT hr = S_OK;
LONG lItemType = 0;
WIA_PROPERTY_CONTEXT Context;
*plDevErrVal = 0;
//
// create a WIA property context, to gain access to
// the WIA application's intended settings.
//
hr = wiasCreatePropContext(nPropSpec,
(PROPSPEC*)pPropSpec,
0,
NULL,
&Context);
if(S_OK == hr) {
//
// get the current item type to help determine what property set to validate
//
hr = wiasGetItemType(pWiasContext, &lItemType);
if (S_OK == hr) {
if (lItemType & WiaItemTypeRoot) {
//
// validate root item properties here
//
} else {
//
// validate item properties here
//
WIAS_CHANGED_VALUE_INFO cviDataType;
memset(&cviDataType,0,sizeof(cviDataType));
//
// check to see if the application was updating
// the WIA_IPA_DATATYPE property
//
hr = wiasGetChangedValueLong(pWiasContext,pContext,FALSE,WIA_IPA_DATATYPE,&cviDataType);
if(S_OK == hr) {
if (cviDataType.bChanged) {
//
// This value was changed, and needs to be checked
//
// cviDataType.Current.lVal is the current application setting.
//
} else {
//
// Nothing has been changed, so leave this property alone.
// Let the WIA service function wiasValidateItemProperties
// do the rest of the work for you.
//
}
}
}
//
// free the property context
//
wiasFreePropContext(&Context);
}
//
// call WIA service helper when you have finished updating dependent values
//
if(S_OK == hr) {
//
// call WIA service helper to validate other properties
//
hr = wiasValidateItemProperties(pWiasContext, nPropSpec, pPropSpec);
}
}
return hr;
}