撰寫驅動程式的 WIA 屬性
WIA 迷你驅動程式可以使用下列 WIA 服務函式來更新其 WIA 屬性和有效值的任何目前值:
wiasWriteMultiple
寫入所有 WIA 屬性類型。 這是一般函式,可讓 WIA 驅動程式寫入 WIA 專案上現有的任何屬性,包括自定義屬性。 它可用來寫入每個呼叫的多個屬性。
wiasWritePropStr
寫入字串的 WIA 屬性(類型VT_BSTR)。
wiasWritePropLong
寫入四位元組整數的 WIA 屬性(類型VT_I4)。
wiasWritePropFloat
撰寫四位元組實數的 WIA 屬性(類型VT_R4)。
wiasWritePropGuid
撰寫 GUID 的 WIA 屬性(類型VT_CLSID)。
wiasWritePropBin
寫入屬於不帶正負號位元組字串的 WIA 屬性(類型VT_VECTOR |VT_UI1)。
wiasGetChangedValueLong
取得四位元組整數之 WIA 屬性的目前變更資訊(類型VT_I4)。
wiasGetChangedValueFloat
取得四位元組實數之 WIA 屬性的目前變更資訊(類型VT_R4)。
wiasGetChangedValueGuid
取得 GUID 之 WIA 屬性的目前變更資訊(類型VT_CLSID)。
wiasGetChangedValueStr
取得字串之 WIA 屬性的目前變更資訊(類型VT_BSTR)。
wiasCreatePropContext
建立 WIA 屬性內容,其用於wiasGetChangedValueLong、wiasGetChangedValueFloat、wiasGetChangedValueGuid 和 wiasGetChangedValueStr 服務函式中。
wiasFreePropContext
釋放 wiasCreatePropContext 所建立的配置內容記憶體。
實作 IWiaMiniDrv::d rvValidateItemProperties
當對專案的 WIA 屬性進行變更時,會呼叫 IWiaMiniDrv::d rvValidateItemProperties 方法。 WIA 迷你驅動程式不僅應該檢查值是否有效,而且必須更新任何變更的有效值。
如果 WIA 屬性無效,而且應用程式未寫入該屬性,則無效的值和任何相依值必須變更為有效值,否則驗證失敗(因為應用程式將屬性設定為無效的值)。
下列範例示範 IWiaMiniDrv::d rvValidateItemProperties 方法的 實作 :
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;
}