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

兼容性层必须确保始终调用驱动程序的图像处理筛选器,并且不显式支持 LocalService 帐户的旧应用程序仍能够执行数据传输。 LocalService 帐户在 Microsoft Windows XP 和更高版本的操作系统上可用。

旧驱动程序至少必须公开TYMED_FILE和TYMED_CALLBACK;但是,Windows Vista 驱动程序永远不会公开TYMED_CALLBACK (或TYMED_MULTIPAGE_CALLBACK) 。 兼容性层的传输部分将确保旧版应用程序将看到TYMED_CALLBACK尽管 Windows Vista 驱动程序未实现它。 TYMED_MULTIPAGE_CALLBACK永远不会从 Windows Vista 驱动程序公开。

旧版应用程序将看到 Windows Vista 驱动程序公开TYMED_FILE和TYMED_MULTIPAGE_FILE支持的格式。 对于TYMED_CALLBACK,旧版应用程序将看到与驱动程序为TYMED_FILE公开的格式相同,但有一个例外:兼容性层不会公开 WiaImgFmt_BMP,而是向旧版应用程序公开 WiaImgFmt_MEMORYBMP 。 执行此操作的方法是让兼容性层“截获”对 IWiaMiniDrv::d rvGetWiaFormatInfo 的调用,并添加除 (TYMED_CALLBACK WiaImgFmt_BMPWiaImgFmt_MEMORYBMP) 之外 /的所有 Windows Vista 驱动程序TYMED_FILE格式。 最重要的是,兼容性层在数据传输期间创建自己的旧回调对象,该对象将 Windows Vista 传输消息和写入其流的数据转换为旧传输消息。

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

兼容性层在 WIA COM 代理中创建两个回调对象:一个用于回调传输,一个用于文件传输。 WIA COM 代理实现 IWiaTransferCallback 接口。 此回调对象负责基于流的传输与“旧样式”传输之间的转换。 WIA 兼容层还会启动驱动程序的图像处理筛选器,我们将兼容性层的回调对象传递给该筛选器。 因此,图像处理筛选器将始终在应用程序的上下文中运行,就像在 Windows Vista 传输中一样。

下图演示了兼容性层如何与 Windows Vista 驱动程序和旧版应用程序配合使用。

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

WIA COM 代理中的旧回调对象将写入流的 Windows Vista 传输消息和数据转换为旧传输消息,并将数据写入文件或带状数据回调。

当驱动程序调用它从 IWiaMiniDrvTransferCallback::GetNextStream 方法接收的 IStream 接口公开的任何方法时, (请注意,驱动程序应仅调用 IStream::WriteIStream::SeekIStream::SetSize) 。 因此,兼容性层会创建一个自定义 IStream 实现,该实现只是包装 WIA COM 代理提供的 IStream 接口。

旧文件传输非常简单。 此类传输的一个示例是旧应用程序调用 IWiaDataTransfer::idtGetData 时。 兼容性层在应用程序在 STGMEDIUM 结构中指定的文件上创建数据流。 此流在调用 IWiaTransferCallback::GetNextStream 时传递给驱动程序或图像处理筛选器,并且所有传输消息都很容易映射到旧传输消息。 有关如何映射消息的更详细说明,请参阅 WIA 兼容层数据传输实现

调用 IWiaDataTransfer::d tGetData 方法时,兼容性层会执行一些更严格的参数检查。 例如,兼容性层不允许使用 TYMED_FILE 调用 IWiaDataTrasnfer::idtGetData 方法,页计数高于 1。在不使用兼容性层的数据传输中,可以使用 TYMED_FILE 调用 IWiaDataTrasnfer::idtGetData 方法,并且页计数大于 1。

旧式回调传输有点复杂。 由于 Windows Vista 驱动程序不支持旧版驱动程序所需的 WiaImgFmt_MEMORYBMP,因此兼容性层的回调对象必须处理从 WiaImgFmt_BMPWiaImgFmt_MEMORYBMP 的转换。 传输消息之间的映射也不太简单。 兼容性层创建自己的流实现。 兼容性层在应用程序调用 IStream::Write 方法时,会将IT_MSG_DATA消息发送到应用程序的回调。

在实现兼容性层时,必须对 IWiaTransfer 接口进行更改;函数 IWiaTransfer::EnumWIA_FORMAT_INFO 已添加到 IWiaTransfer 以允许TYMED_MULTIPAGE_FILE传输。 此添加不是兼容性层的结果,但是必需的,因为无法从 IWiaTransfer 接口或从 IWiaItem2 接口到 IWiaItem 接口访问 IWiaDataTransfer 接口。

Microsoft Windows SDK文档中讨论了 IWiaDataTransferIWiaTransferIWiaItem、IWiaItem2IStream 接口以及 STGMEDIUM 结构。

IWiaMiniDrvTransferCallback