技术概览 Technical Overview

TWAIN架构(TWAIN Architecture)

数据交互的实现在TWAIN中由三类软件元素共同工作完成:应用程序(the application),数据源管理器(the Source Manager),以及数据源(the Source)。

这些元素使用TWAIN的协议架构来进行通讯。TWAIN架构由四层组成:

  • 应用(Application)

  • 协议(Protocol)

  • 采集(Acquisition)

  • 设备(Device)

TWAIN软件元素占据了如下图所示的各层。后续的各节中介绍了每一层。

应用层(Application)

用户的软件应用执行将会在这层中。

TWAIN为应用程序开发者关注用户如何访问使用TWAIN的功能以及如何选择指定的数据源描述了用户接口指引。

TWAIN不关注应用程序是如何实现的。TWAIN不会对任何应用可能会使用的应用间通讯模式造成影响。

协议层(Protocol)

协议是TWAIN所使用的用以描述的“语言”和语法。它实现了详细准确的指令和用以数据交换的通讯要求。

协议层包含:

  • 应用软件的部分模块,该模块提供用于应用程序和TWAIN之间交互的接口。

  • 由TWAIN所提供的TWAIN数据源管理器。

  • 包含数据源设备用以接受来自数据源管理器以及回复的数据和返回码(Return Code)。

  • 由TWAIN所提供的TWAIN数据源管理器。

  • 数据源设备包含的软件模块,该模块用以接受来自数据源管理器以及回复的数据和返回码(Return Code)。

有关协议层的更多细节内容将会在“TWAIN元素间通讯(Communication Between the Elements of TWAIN)”中进行讨论。

采集层(Acquisition)

数据采集设备或许是物理的(像是扫描仪或是数字高拍仪)或是逻辑的(像是一个图像数据库)。编写用以控制采集物的被称为数据源(Sources),主要位于此层中。

数据源为应用传输数据。它使用与应用商议好的格式和传输机制(进行传输)。

数据源总会提供内建的用户界面,来控制将数据源写入驱动器的设备。如果想的话,应用程序可以为了获取数据重写这个用户界面来提供它自己的用户界面。

设备层(Device)

该层是传统的底层设备驱动模块。它们将特定于设备的命令转换为特定于驱动程序随附的特定设备的硬件命令和操作。使用TWAIN的应用不在需要发布设备驱动,因为它们已经是数据源的一部分了。

TWAIN完全不关心设备层。数据源向应用隐藏了设备层。数据源提供了从TWAIN操作以及与数据源用户界面的交互到设备驱动程序的等效命令的转换,这些命令使得设备按照预期运行。

注意:协议层是最彻底和最严格的定义,以允许应用程序和源之间进行精确的通信。本文档的内容将集中在协议和采集层。

TWAIN 用户界面(TWAIN User Interface)

当一个应用使用TWAIN来获取数据的时候,获取的处理过程可能会在如下的三个部分被应用的用户所看到:

应用程序(The Application)

用户需要选择他们想要来获取数据的设备。他们也需要在已经完成数据传输后获得通知。为了实现这一场景,TWAIN强烈推荐应用程序开发者添加两个选项到他们的文件菜单:

  • 选择设备源(Select Source)。选择设备。

  • 获取(Acquire)。开始进行传输。

数据源管理器(The Source Manager)

当用户选择选择数据源(Select Source)选项的时候,应用程序向数据源管理器请求展示选择数据源的对话框。这个对话框列出所有可以使用的设备以及允许用户选择其中的一个。如果愿意,应用程序也可以编写自己版本的用户界面来做这件事。

数据源(The Source)

每一个遵循TWAIN规范的数据源会其特定的设备提供一个用户界面。当应用程序的用户选择了获取(Acquire)选项的时候,数据源的用户界面可能会显示。如果愿意,应用程序也可以编写它自己版本的用户界面。

TWAIN元素间通讯(Communication Between the Elements of TWAIN)

在TWAIN元素间通讯可以通过两个入口点(entry point)来实现。他们被称作DSM_Entry()和DS_Entry()。DSM意思是Data Source Manager(数据源管理器),DS意思是Data Source(数据源)。

应用(The Application)

应用的目标是从数据源处获取数据。然而,应用无法与数据源进行直接的联系。所有对于数据的请求,,功能信息,错误信息等都必须要通过数据源管理器来进行处理。

TWAIN定义了大约140种操作。应用发送这些操作请求到数据源管理器以实现传输动作。应用为每一次的指定数据源管理器或是数据源来作为每一次操作请求的终端。

应用程序与数据源管理器进行通讯只会使用数据源管理器的入口,DSM_Entry()函数。

DSM_Entry()函数的参数包含:

  • 一个标识结构体,提供了关于调用该方法的应用程序的信息。

  • 请求的目标对象(数据源管理器或是数据源)

  • 一个描述了请求操作的三元组。三元组包括:

    • 操作的数据组(Data Group,DG_)
    • 操作的数据参数类型(Data Argument Type,DAT_)
    • 操作的消息(Message,MSG_)
  • (后续的使用操作三元组的一节将会描述更多的信息)

  • 允许数据传输的指针字段

函数的调用会返回一个值(返回码,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头文件中找得到对应的定义。

数据源管理器(The Source Manager)

数据源管理器为应用程序和数据源之间提供了通讯通道,支持了用户进行数据源的选择,以及为了通过应用程序的访问加载数据源。从应用程序到数据源的通讯以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
);

TWAIN-v2.4-说明文档翻译(2)技术概览的更多相关文章

  1. BizTalk 开发系列(三十九) BizTalk Server 2009技术概览

    BizTalk Server 2009已经发布一段时间了,之前Beta版发布的时候也写过一篇文章<BizTalk Server 2009 Beta初体验>, 当时比较了2006 R2与20 ...

  2. Windows Phone 8.1 开发技术概览 (Universal APP)

    前一阵真的比较懒 WP8.1 已经出来这么长时间了现在才更新BLOG让大家久等了,今天我先为大家介绍下 WP 8.1的开发框架,什么是微软所推崇的 Universal APP,以及我们要开发 Univ ...

  3. 【转】Intel RealSense(实感技术)概览

    Intel RealSense(实感技术)概览 1 Reply 版权声明:本文系本站作者自己翻译整理,欢迎转载,但转载请以超链接形式注明文章来源(planckscale.info).作者信息和本声明, ...

  4. Java SE技术概览 - Jave SE Platform at a Glance

    从学习到工作,使用Java有几年时间,一直没有好好端详一下她的“内涵”.无意中看到一个关于Java SE的概览图,发现Java中提供的API还挺系统全面,把她放到博客中,相信对于想系统了解Java技术 ...

  5. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

  6. 前端可视化建模技术概览,包括:GoJS

    我推荐使用的: 库 网址 备注 GoJS https://gojs.net/latest/samples/flowchart.html 推荐使用 相关文章: 前端可视化建模技术概览:http://le ...

  7. Spring Cloud(一):服务治理技术概览【Finchley 版】

    Spring Cloud(一):服务治理技术概览[Finchley 版]  发表于 2018-04-14 |  更新于 2018-05-07 |  Spring Cloud Netflix 是 Spr ...

  8. Spring Cloud微服务技术概览

    Spring Cloud 是一系列框架的有序集合.它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都 ...

  9. Android埋点技术概览

    注:本文同步发布于微信公众号:stringwu的互联网杂谈Android无埋点技术概览 本文是Android无埋点系列的开篇---埋点技术概览 1 背景 埋点是数据产品经理(分析师)基于业务需求,对用 ...

随机推荐

  1. android Handler消息通信

    1 package com.example.testhandler; 2 3 import android.os.Bundle; 4 import android.os.Handler; 5 impo ...

  2. 使用dom4j工具:读取xml(一)

    package dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.io.SAXReader; / ...

  3. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  4. 再见了,我的散装研发管理平台;再见了,4台ECS!

    周末的时候,收到好几个云服务器临近过期的通知短信,准备续个费,居然都要大几千!因为这几个都是以前低价抢购的,掐指一算,如果都续费的话,要蚕食好多利润!作为一名自己养活自己的独立开发者,节省成本是必备技 ...

  5. 🏆【Alibaba工具型技术系列】「EasyExcel技术专题」摒除OOM!让你的Excel操作变得更加优雅和安全

    前提概要 针对于后端开发者而言的,作为报表的导入和导出是一个很基础且有很棘手的问题!之前常用的工具和方案大概有这么几种: JXL(Java Excel API 工具服务),此种只支持xls的文件格式, ...

  6. 20210720 noip21

    又是原题,写下题解吧 Median 首先时限有 2s(学校评测机太烂,加到 4s 了),可以放心地筛 \(1e7\) 个质数并算出 \(s_2\),然后问题变为类似滑动求中位数.发现 \(s_2\) ...

  7. 【死磕NIO】— NIO基础详解

    Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计.Java NIO 由三个核心组件组件: Buffer Channel Sele ...

  8. word域实现动态填充信息附件下载

    1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...

  9. NOIP模拟51

    樱花满地集于我心,楪舞纷飞祈愿相随 前言 太菜了,人手切掉两个题,我竟然一道都不会.. 改 T3 的时候整个人的心态都崩掉了,一部分原因可能是语文素养不高导致我看不懂题解. 另一部分可能就是系太不太好 ...

  10. Tars | 第7篇 TarsJava Subset最终代码的测试方案设计

    目录 前言 1. SubsetConf配置项的结构 1.1 SubsetConf 1.2 RatioConfig 1.3 KeyConfig 1.4 KeyRoute 1.5 SubsetConf的结 ...