使用 IStiUSD 转义方法

调用 IStiUSD::Escape 方法将信息直接传递到硬件。 此方法仅在 Windows XP 和更高版本的操作系统上受支持。

与 TWAIN 兼容的应用程序与 WIA 驱动程序之间的所有通信首先转到数据源管理器 (twain_32.dll) ,后者又调用 TWAIN 兼容层 (wiadss.dll) 。 然后,TWAIN 兼容层调用 WIA 驱动程序的 IStiUSD::Escape 方法,并将以下两个转义代码之一传递给方法:

ESC_TWAIN_CAPABILITY 转义码

ESC_TWAIN_PRIVATE_SUPPORTED_CAPS 转义码

当 TWAIN 应用程序请求 WIA 驱动程序的专用功能列表时,TWAIN 兼容性层会调用驱动程序的 IStiUSD::Escape 方法,并在调用中传递ESC_TWAIN_PRIVATE_SUPPORTED_CAPS。 如果驱动程序不支持直通功能,它将返回 TWAIN 兼容层的静态 (默认) 功能列表。 否则,驱动程序会将支持的专用功能列表返回到 TWAIN 兼容层。

当 TWAIN 应用程序发送的功能操作不在 TWAIN 兼容层的默认列表中时,TWAIN 兼容层调用驱动程序的 IStiUSD::Escape 方法,这次在调用中传递ESC_TWAIN_CAPABILITY。

然而,上述解释有点过于简单化。 当 TWAIN 应用程序请求驱动程序的专用功能列表时,TWAIN 兼容性层实际上会对驱动程序的 IStiUSD::Escape 方法进行两次调用。 在第一次调用中,TWAIN 兼容性层会询问 WIA 驱动程序存储功能列表所需的内存量。 然后,TWAIN 兼容层会分配该内存量供 WIA 驱动程序使用。 第二次调用中,TWAIN 兼容性层要求 WIA 驱动程序提供功能列表,WIA 驱动程序会将该功能列表复制到前面提到的内存中。 TWAIN 兼容层负责分配和释放 TWAIN-WIA 事务中使用的所有内存。 此排列方式可防止 WIA 驱动程序释放 TWAIN 兼容层正在使用的内存。

TWAIN 兼容性层还会在传递ESC_TWAIN_CAPABILITY并获取功能时调用驱动程序的 IStiUSD::Escape 方法两次。 第一次调用询问 WIA 驱动程序存储该功能所需的内存量,第二次调用将返回该功能。 请注意,SET 功能操作只需要对 IStiUSD::Escape 进行一次调用,因为不需要分配内存。

应按以下顺序验证对 IStiUSD::Escape 方法的所有调用:

  1. 验证 EscapeFunction 函数代码。 如果无效,请立即失败。 这可以防止在驱动程序中处理不正确的代码。

  2. 验证传入缓冲区 lpInData。 如果无效,请立即失败。 无效的传入缓冲区可能导致 WIA 驱动程序崩溃。

  3. 验证传出缓冲区 pOutData。 如果无效,请立即失败。 如果驱动程序无法通过写入必要的数据来完成请求,则无需处理该数据。

  4. 验证传出缓冲区的大小。 如果驱动程序无法将正确的数据量写入传出缓冲区,则调用方无法正确处理该数据。

以下部分中的代码示例演示了如何使用传递功能,为具有专用功能的 TWAIN 应用程序提供支持。 代码示例使用头文件 wiatwcmp.h 中定义的两个转义代码,ESC_TWAIN_PRIVATE_SUPPORTED_CAPS和ESC_TWAIN_CAPABILITY。

ESC_TWAIN_PRIVATE_SUPPORTED_CAPS 转义码

ESC_TWAIN_CAPABILITY 转义码