Применение параметров свойств WIA к оборудованию
Когда приложение WIA инициирует передачу данных, служба WIA предоставляет мини-накопителю WIA возможность применять текущие параметры свойств WIA и применять к оборудованию любые параметры, относящиеся к устройству. Затем служба WIA вызывает метод IWiaMiniDrv::d rvWriteItemProperties , прежде чем вызывать метод IWiaMiniDrv::d rvAcquireItemData . Последний метод вызывается только в том случае, если приложение WIA инициирует передачу данных. Мини-драйвер WIA должен использовать функции службы WIA для чтения свойств в собственном дереве элементов драйвера.
Реализация IWiaMiniDrv::d rvWriteItemProperties
Служба WIA вызывает метод IWiaMiniDrv::d rvWriteItemProperties после того, как клиент запросит передачу данных. Служба WIA вызывает этот метод перед вызовом IWiaMiniDrv::d rvAcquireItemData. Перед возвратом из этого метода мини-диск WIA должен зафиксировать все необходимые параметры на оборудовании.
При вызове этого метода мини-накопитель WIA был зафиксирован для выполнения передачи данных. Служба WIA завершится сбоем любого приложения, которое пытается получить данные в настоящее время с кодом ошибки WIA_ERROR_BUSY.
В следующем примере показана реализация метода IWiaMiniDrv::d rvWriteItemProperties :
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;
}