Написание свойств WIA драйвером
Мини-driver WIA может обновить любое из текущих значений его свойств WIA и допустимых значений с помощью следующих функций службы WIA:
wiasWriteMultiple
Запись всех типов свойств WIA. Это общая функция, которая позволяет драйверу WIA записывать любое свойство, существующее в элементе WIA, включая пользовательские свойства. Его можно использовать для записи в несколько свойств для каждого вызова.
wiasWritePropStr
Запись свойств WIA, которые являются строками (тип VT_BSTR).
wiasWritePropLong
Запись свойств WIA, которые представляют собой байтовые целые числа (тип VT_I4).
wiasWritePropFloat
Запись свойств WIA, которые представляют собой четыре байта реальных чисел (тип VT_R4).
wiasWritePropGuid
Запись свойств WIA, которые являются идентификаторами GUID (тип VT_CLSID).
wiasWritePropBin
Запись свойств WIA, которые являются строками неподписанных байтов (тип VT_VECTOR | VT_UI1).
wiasGetChangedValueLong
Получите текущие измененные сведения для свойств WIA, которые являются четырехбайтовых целых чисел (тип VT_I4).
wiasGetChangedValueFloat
Получите текущие измененные сведения для свойств WIA, которые являются четырьмя байтами реальных чисел (тип VT_R4).
wiasGetChangedValueGuid
Получите текущие измененные сведения для свойств WIA, которые являются идентификаторами GUID (тип VT_CLSID).
wiasGetChangedValueStr
Получите текущие измененные сведения для свойств WIA, которые являются строками (тип VT_BSTR).
wiasCreatePropContext
Создайте контекст свойства WIA, который используется в функциях службы wiasGetChangedValueLong, wiasGetChangedValueFloat, wiasGetChangedValueGuid и wiasGetChangedValueStr.
wiasFreePropContext
Освободите выделенную память контекста, созданную wiasCreatePropContext.
Реализация IWiaMiniDrv::d rvValidateItemProperties
Метод IWiaMiniDrv::d rvValidateItemProperties вызывается при внесении изменений в свойства WIA элемента. Мини-driver 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;
}