在 Windows Vista 应用程序和旧版驱动程序之间进行的数据传输

兼容性层使 Windows Vista 应用程序能够调用 IWiaTransfer::D ownload (,如旧版驱动程序上) Microsoft Windows SDK文档中所述。 兼容性层必须实现文件夹传输代码和格式转换。 兼容性层为送纸器传输实现特殊代码,以确保始终可以从旧版驱动程序传输多个页面。 Windows Vista 应用程序应该始终能够在扫描过程中从送纸器项请求多个页面,即使TYMED_FILE传输也是如此。 下图演示了具有 Windows Vista 应用程序的旧版驱动程序。

说明 Windows vista 应用程序和旧版驱动程序之间数据传输的示意图。

WIA 服务中的旧回调对象将旧传输消息和数据转换为 Windows Vista 传输消息,并将数据写入提供的流。

Windows Vista 应用程序仅需要TYMED_FILE和TYMED_MULTIPAGE_FILE因此兼容性层负责确保不会从旧驱动程序向 Windows Vista 应用程序公开TYMED_CALLBACK和TYMED_MULTIPAGE_CALLBACK。

实现兼容性层这一部分的最简单方法是始终使用TYMED_FILE和TYMED_MULTIPAGE_FILE集调用旧版驱动程序。 这样做的缺点是驱动程序始终必须扫描整个映像,然后才能将数据写回到应用程序的流中。 因此,当 Windows Vista 应用程序请求扫描格式 WiaImgFmt_BMP (设置为 WiaImgFmt_BMP) WIA_IPA_FORMAT 属性时 ,兼容性层将使用 TYMED_CALLBACK 。 这样,兼容性层就可以按波段向后写入数据带。

但是,旧驱动程序不支持 WiaImgFmt_BMP,但 WiaImgFmt_MEMORYBMP TYMED_CALLBACK。 因此,转换回调对象必须创建 BMP 文件头,并将此文件头写回应用程序。 有时这很容易,例如当 BMP 文件头可以直接从 BMP 信息标头构造时。 但是,在某些情况下,BMP 信息标头的高度设置为 0。 在这种情况下,WIA 兼容层必须等到传输所有数据,然后才能写入 BMP 文件标头并更新 BMP 信息标头。

TYMED 传输(仅TYMED_CALLBACK)从旧驱动程序进行预制的原因是,多页格式通常仅受TYMED_MULTIPAGE_FILE支持,而驱动程序通常支持TYMED_FILE格式多于TYMED_CALLBACK格式。

在TYMED_FILE传输期间,兼容性层会等到传输完成,然后才将数据写回应用程序的流。 这是通过将文件映射到内存并在单个写入请求中将内存中的所有数据写回来完成的。

在TYMED_CALLBACK传输期间,每次从旧驱动程序收到IT_MSG_DATA传输消息时,兼容性层都会写回到应用程序的流。

兼容性层还包含用于 FEEDER 传输的特殊代码。 此代码可确保兼容性层可以从 ADF 传输多个页面,即使 TYMED 未TYMED_MULTIPAGE_FILE。 执行此操作的方式是让兼容性层多次调用驱动程序,每次只请求一个页面。 此解决方案可确保当 Windows Vista 应用程序调用时,每个旧版驱动程序都能够处理来自送纸器的多个页面的传输。

旧版驱动程序可以在传输期间发送“带外”消息, (例如预览) 。 这些消息将被忽略,因为它们不适合基于流的传输模型。

有关 TYMED 常量的详细信息,请参阅 了解 TYMED