次の方法で共有


WIA プロパティ設定をハードウェアへ適用する

WIA アプリケーションがデータ転送を開始すると、WIA サービスは、WIA ミニドライバーに現在の WIA プロパティ設定を適用し、デバイス固有の設定をハードウェアに適用する機会を提供します。 WIA サービスは IWiaMiniDrv::drvWriteItemProperties メソッドを呼び出してから、 IWiaMiniDrv::drvAcquireItemData メソッドを呼び出します。 後者のメソッドは、WIA アプリケーションがデータ転送を開始する場合にのみ呼び出されます。 WIA ミニドライバーは、WIA サービス関数を使用して、独自のドライバー項目ツリーのプロパティを読み取る必要があります。

IWiaMiniDrv::drvWriteItemProperties を実装する

WIA サービスは、クライアントがデータ転送を要求した後、 IWiaMiniDrv::drvWriteItemProperties メソッドを呼び出します。 WIA サービスは IWiaMiniDrv::drvAcquireItemData の呼び出しを行う前に、このメソッドを呼び出します。 WIA ミニドライバーは、このメソッドから戻る前に、ハードウェアに必要な設定をコミットする必要があります。

このメソッドが呼び出されると、WIA ミニドライバーはデータ転送の実行にコミットされています。 WIA サービスは、現時点で WIA_ERROR_BUSY エラー コードを使用してデータを取得しようとするアプリケーションに失敗します。

次のコード例は IWiaMiniDrv::drvValidateItemProperties メソッドの実装を示しています。

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;
}