Поделиться через


Применение параметров свойств 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;
}