数据交互的实现在TWAIN中由三类软件元素共同工作完成:应用程序(the application),数据源管理器(the Source Manager),以及数据源(the Source)。
这些元素使用TWAIN的协议架构来进行通讯。TWAIN架构由四层组成:
应用(Application)
协议(Protocol)
采集(Acquisition)
设备(Device)
TWAIN软件元素占据了如下图所示的各层。后续的各节中介绍了每一层。
用户的软件应用执行将会在这层中。
TWAIN为应用程序开发者关注用户如何访问使用TWAIN的功能以及如何选择指定的数据源描述了用户接口指引。
TWAIN不关注应用程序是如何实现的。TWAIN不会对任何应用可能会使用的应用间通讯模式造成影响。
协议是TWAIN所使用的用以描述的“语言”和语法。它实现了详细准确的指令和用以数据交换的通讯要求。
协议层包含:
应用软件的部分模块,该模块提供用于应用程序和TWAIN之间交互的接口。
由TWAIN所提供的TWAIN数据源管理器。
包含数据源设备用以接受来自数据源管理器以及回复的数据和返回码(Return Code)。
由TWAIN所提供的TWAIN数据源管理器。
数据源设备包含的软件模块,该模块用以接受来自数据源管理器以及回复的数据和返回码(Return Code)。
有关协议层的更多细节内容将会在“TWAIN元素间通讯(Communication Between the Elements of TWAIN)”中进行讨论。
数据采集设备或许是物理的(像是扫描仪或是数字高拍仪)或是逻辑的(像是一个图像数据库)。编写用以控制采集物的被称为数据源(Sources),主要位于此层中。
数据源为应用传输数据。它使用与应用商议好的格式和传输机制(进行传输)。
数据源总会提供内建的用户界面,来控制将数据源写入驱动器的设备。如果想的话,应用程序可以为了获取数据重写这个用户界面来提供它自己的用户界面。
该层是传统的底层设备驱动模块。它们将特定于设备的命令转换为特定于驱动程序随附的特定设备的硬件命令和操作。使用TWAIN的应用不在需要发布设备驱动,因为它们已经是数据源的一部分了。
TWAIN完全不关心设备层。数据源向应用隐藏了设备层。数据源提供了从TWAIN操作以及与数据源用户界面的交互到设备驱动程序的等效命令的转换,这些命令使得设备按照预期运行。
注意:协议层是最彻底和最严格的定义,以允许应用程序和源之间进行精确的通信。本文档的内容将集中在协议和采集层。
当一个应用使用TWAIN来获取数据的时候,获取的处理过程可能会在如下的三个部分被应用的用户所看到:
用户需要选择他们想要来获取数据的设备。他们也需要在已经完成数据传输后获得通知。为了实现这一场景,TWAIN强烈推荐应用程序开发者添加两个选项到他们的文件菜单:
选择设备源(Select Source)。选择设备。
获取(Acquire)。开始进行传输。
当用户选择选择数据源(Select Source)
选项的时候,应用程序向数据源管理器请求展示选择数据源的对话框。这个对话框列出所有可以使用的设备以及允许用户选择其中的一个。如果愿意,应用程序也可以编写自己版本的用户界面来做这件事。
每一个遵循TWAIN规范的数据源会其特定的设备提供一个用户界面。当应用程序的用户选择了获取(Acquire)
选项的时候,数据源的用户界面可能会显示。如果愿意,应用程序也可以编写它自己版本的用户界面。
在TWAIN元素间通讯可以通过两个入口点(entry point)来实现。他们被称作DSM_Entry()
和DS_Entry()
。DSM意思是Data Source Manager(数据源管理器),DS意思是Data Source(数据源)。
应用的目标是从数据源处获取数据。然而,应用无法与数据源进行直接的联系。所有对于数据的请求,,功能信息,错误信息等都必须要通过数据源管理器来进行处理。
TWAIN定义了大约140种操作。应用发送这些操作请求到数据源管理器以实现传输动作。应用为每一次的指定数据源管理器或是数据源来作为每一次操作请求的终端。
应用程序与数据源管理器进行通讯只会使用数据源管理器的入口,DSM_Entry()
函数。
DSM_Entry()
函数的参数包含:
一个标识结构体,提供了关于调用该方法的应用程序的信息。
请求的目标对象(数据源管理器或是数据源)
一个描述了请求操作的三元组。三元组包括:
(后续的使用操作三元组的一节将会描述更多的信息)
允许数据传输的指针字段
函数的调用会返回一个值(返回码,the Return Code)来展示本次操作成功与否。
TW_UINT16 TW_CALLINGSTYLE DSM_Entry
(
pTW_IDENTITY pOrigin, // source of message
pTW_IDENTITY pDest, // destination of message
TW_UINT32 DG, // data group ID: DG_xxxx
TW_UINT16 DAT, // data argument type: DAT_xxxx
TW_UINT16 MSG, // message ID: MSG_xxxx
TW_MEMREF pData // pointer to data
);
注意:数据类型定义将会在第8章,“数据类型和数据结构(Data Types and Data Structures”种讲解,同时也会在从TWAIN Working Group站点[http://www.twain.org]下载的TWAIN.H头文件中找得到对应的定义。
数据源管理器为应用程序和数据源之间提供了通讯通道,支持了用户进行数据源的选择,以及为了通过应用程序的访问加载数据源。从应用程序到数据源的通讯以DSM_Entry()
作为入口点。
如果DSM_Entry调用中的目标是数据源管理器。
数据源管理器将会自己处理这个操作。
如果DSM_Entry调用中的目标是数据源。
数据源管理器会传输信息参数列表,移除目标参数,并且调用适合的数据源。为了联络到数据源,数据源管理器调用数据源的DS_Entry()
函数。TWAIN要求所有的数据源都必须要由这个入口点。
在C语言风格下,DS_Entry
函数调用如下所示:
TW_UINT16 TW_CALLINGSTYLE DSM_Entry
(
pTW_IDENTITY pOrigin, // source of message
TW_UINT32 DG, // data group ID: DG_xxxx
TW_UINT16 DAT, // data argument type: DAT_xxxx
TW_UINT16 MSG, // message ID: MSG_xxxx
TW_MEMREF pData // pointer to data
);
手机扫一扫
移动阅读更方便
你可能感兴趣的文章