WIA-TWAIN 兼容性

如果设备可以有两个或更多个驱动程序,请彻底测试这些驱动程序,以确保彼此兼容。 例如,如果一个驱动程序使设备处于不可用状态, (例如驱动程序未在某些协议) 中发送关闭会话消息,则另一个驱动程序在尝试与设备通信时可能会失败。 这种情况经常发生在串行设备中。

同一 DLL 中的 WIA 和 TWAIN

如果同时从单个 DLL 运行 WIA 驱动程序和 TWAIN 驱动程序,WIA 服务和 TWAIN 应用程序将同时加载此 DLL 的实例。 DLL 的 WIA 实例将生成 WIA 项树。 此树表示相机上的文件夹和图像。 使用 WIA ((如“我的计算机”或“扫描仪和相机向导”) )的任何应用程序都将在驱动程序中具有项树的副本。

通过 TWAIN 驱动程序删除或添加映像时,WIA 驱动程序不会收到有关此更改的通知。 因此,WIA 项树将包含已删除的图像,或者不包含已添加的图像。 在任一情况下,驱动程序都必须刷新其项树。 为此,TWAIN 驱动程序必须命令 WIA 驱动程序在添加或删除映像时刷新其项树。

执行此操作的一种方法是从 TWAIN 驱动程序调用 CoCreateInstance (CLSID_IWiaDevMgr,...) ,枚举所有设备,然后搜索设备。 通过此枚举标识驱动程序的一种方法是在 WIA 驱动程序中创建一个自定义属性,以便如果 TWAIN 驱动程序查询此属性并且该属性存在,则会知道它是 WIA 驱动程序。 为驱动程序获取 IWiaItem 后,向驱动程序发送命令以重新生成其树 (例如,在调用 IWiaItem::D eviceCommand 方法时向其发送 WIA CMD_SYNCHRONIZE 命令) 。 Microsoft Windows SDK文档中介绍了 CoCreateInstanceIWiaDevMgrIWiaItem

刷新 WIA 项树的另一种方法是在 WIA 驱动程序中创建命名 事件 。 然后,WIA 驱动程序中的线程可以等待此事件发出信号。 每当通过 TWAIN 驱动程序删除或添加映像时,TWAIN 驱动程序会在此命名事件上调用 Windows SDK 文档) ) 中所述的 SetEvent (来发出 (信号。 然后,WIA 驱动程序中的线程将被释放,WIA 驱动程序将重新生成树。

无论采用哪种方式,都应重新生成树,使其反映对相机或扫描仪上实际图像所做的任何更改。 请确保每当通过添加或删除项树中的项来更新树时,将事件排队 (例如,WIA_EVENT_ITEM_DELETED或WIA_EVENT_TREE_UPDATED (这些和其他 WIA 事件标识符的说明,请参阅 Windows SDK 文档) ) 。 如果在树更改时成功发送事件,这将解决“我的计算机”和其他 WIA 应用程序未自动更新的问题。

注意 虽然 TWAIN 和 WIA 驱动程序可能位于同一 DLL 中,但 WIA 和 TWAIN 驱动程序不能共享相同的 UI。 每个驱动程序必须有自己的 UI。