一、TWAIN的文件组成

TWAIN共包括4个二进制文件。如果要使用该接口,就必须要保证他们被成功地安装在本地计算机上。

文 件 名

说 明

TWAIN_32.DLL

32位应用程序的支持文件,32位程序使用TWAIN通讯必须使用该文件。

TWAIN.DLL

16位应用程序的支持文件,16位程序使用TWAIN通讯必须使用该文件。

TWUNKER_32.EXE

实现32位应用程序与32位数据源进行通讯,它运行时不可见。

TWUNKER_16.EXE

实现32位应用程序与16位数据源进行通讯,它运行时不可见。

注意:在Windows NT 环境下16位数据源不能够正常工作。

在Windows 操作系统中(Windows 9x / 2000 / XP ),Microsoft已经把这些文件作为系统文件随同操作系统一起发布了。你可以在Windows安装目录中查找到这些文件。如果我们要编程来实现对TWAIN的访问,还需要最重要的头文件。你通过访问该http://www.twain.org/devfiles/twain.h 地址来获得TWAIN提供的头文件。

二、TWAIN的结构

TWAIN依靠三个组件协同完成与图像设备的通讯和数据传输工作,这三个组件就是 Application、Source Manager和Source。

组件

说明

Application

就是你要编写的应用程序。

Source Manager

是由TWAIN提供的一个Source的管理器,它不仅可以收集本地系统已经安装了的图像设备,还可以根据需要去加载设备。同时,它最重要的功能是担任Application 与Source通讯的桥梁。(其实,它就是我们前面提到的组成文件中的dll文件。)

Source

在这里可以看作是图像设备。事实上它是由设备厂家提供的一个dll文件。这个dll文件是支持twain接口的。(该文不讨论关于twain在Source中的应用。)

它们的层次结构图如下:

从该图我们可以看到,Application要从Source获得图像数据,必须通过Source Manager传递来实现。Application与Source Manager 间的通讯是靠调用TWAIN提供的DSM_Entry( )函数实现。而Application不能直接与Source 通讯,Source Manager与Source 间的通讯是靠调用TWAIN提供的DS_Entry( )函数实现(在这里,我们不用关心Source Manager如何去调用DS_Entry函数。

三、TWAIN的用户界面

当我们使用TWAIN接口去获得图像数据的时候,会涉及到一些的用户界面,首先是我们的应用程序界面,然后是Source Manager提供的用户界面以及图像设备(Source)所提供的用户界面。

在我们的应用程序中,可以通过“选择设备”来打开Source Manager的标准用户界面。Source Manager的界面由Source Manager提供。在这个界面中可以让用户选择他想要使用的图像设备。选中想要的设备后,再通过“获取…”来打开图像设备(Source)提供的用户界面进行现应的操作。(注:Source提供的界面会因为你使用的图像设备不同而有差异。)

对于这些界面,TWAIN提供了非常灵活的处理方法。对于Source Manager提供的用户界面以及图像设备(Source)所提供的用户界面,我们可以选择是否显示它们,甚至我们还可以按自己的要求去改写这些用户界面。

四、TWAIN的接口函数

要编写应用程序实现与支持TWAIN标准的图像设备通讯,只需要了解上面提到的DSM_Entry()接口函数。TWAIN定义了大约140个操作消息。你只要把这些消息通过DSM_Entry()函数发给Source Manager,就可以实现对选定的Source进行相应的操作。Source Manager会分辨那些消息属于自己,那些消息是该转发给Source。

在介绍DSM_Entry()前,我们先来了解一下的TWAIN定义的消息格式。TWAIN把它定义的操作称为Triplets操作,就是每个操作用三个定义的参数来表示。这个三个参数用不同前缀名来区分。每个Triplets操作都是唯一的,不会有歧意,它们代表一个特定的操作行为。这三个参数类型分别是Data Group(前缀名DG_ )、 Data Argument(前缀名DAT_ ) 和 Message ID(前缀名MSG_ ),每个参数都包含有各自的信息。比如:DG_CONTROL / DAT_PARENT / MSG_OPENDSM 就表示一个打开Source Manager的操作,这些参数在TWAIN.H中都有定义。其他的操作(设置扫描仪的分辨率、获得设备支持的功能等等…)你可以去查看TWAIN的参考手册,我将在后面编程应用中介绍几个最常用的操作。

现在,我们明白了TWAIN定义的Triplets操作,但是这还不够。在使用DSM_Entry()前,必须要加载TWAIN_32.DLL文件以获得DSM_Entry()函数指针。(注意:在你程序中应该添加前面提到的TWAIN.H头文件哦!)

DSMENTRYPROC lpDSM_Entry;   //* DSM_Entry 入口函数的指针

HMODULE      hDSMDLL;       //* Twain_32.Dll句柄

……

//* 加载TWAIN_32.DLL 文件

if ((hDSMDLL = LoadLibrary("TWAIN_32.DLL")) != NULL)

{

if (hDSMDLL)           //* 检查TWAIN_32.DLL是否加载

{

if ( (lpDSM_Entry =(DSMENTRYPROC) GetProcAddress(hDSMDLL,MAKEINTRESOURCE(1)))!=NULL)

{

//* 成功获得 DSM_Entry()函数指针;

}

}

}

现在我们明白了,TWAIN所有的操作都是通过DSM_Entry()函数来实现的,所以了解该入口函数很有必要。它定义如下:

TW_UINT16 FAR PASCAL DSM_Entry

( pTW_IDENTITY pOrigin,        //* 指向操作发起者的指针

pTW_IDENTITY pDest,          //* 指向目标对象的指针

TW_UINT32 DG,                //* Triplets 操作的DG参数 : DG_xxxx

TW_UINT16 DAT,               //* Triplets 操作的DAT参数: DAT_xxxx

TW_UINT16 MSG,               //* Triplets 操作的MSG参数: MSG_xxxx

TW_MEMREF pData              //* 指向返回数据块的指针

);

其中DG、DAT、MSG参数表示一个你想执行的Triplets操作。pOrigin表示发起Triplets操作的对象。pDest表示接收Triplets操作的对象。pData用于获得执行Triplets操作后返回的数据。

对于每个Triplets操作,都是由DG、DAT、MSG三个参数组合构成的。pOrigin、pDest参数会根据不同的Triplets操作,而使用不同的值。

函数执行后会返回一个值来表示操作是否成功。如果返回值为TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失败。同样根据Triplets操作的类型不同,还会有其他的返回值。比如TWRC_CANCEL、TWCC_LOWMEMORY…,具体信息你可以参考TWAIN的说明手册。

五、TWAIN的操作流程

Application、 Source Manager 和 Source要实现数据传输,必须遵循一个操作流程。你要进行的操作应该在这个流程规定的动作队列中按逻辑去执行。比如,在没有加载Source Manager前,Application是不能要求Source传输数据的。为了更好的去描述这个流程,TWAIN为该流程定义了7个状态(1-7)。

状态位 1, 2, 3

这几个状态是用于描述Source Manager的,它们是Source Manager专有的状态位,所以Source Manager 的标志位是不会大于3的.

状态位4, 5, 6, 7

这几个状态是Source专有的。如果Source打开了,Source 的标志位就不会小于4;如果Source关闭了,Source就没有了标志位。

要注意,我们的应用程序可以使用了多个Source,每个与Source的连接都是一个单独的会话,对于打开的每个Source,他们的标志位都是相互独立的,不互相关联。现在就来看看流程图。

流程标志位说明

状态 1 – 准备会话

在Application和Source Manager建立会话前,Source Manager的标志位是1.

在这个时候,Source Manager还没有被加载到内存中。如果Source Manager 被加载到内存中,则状态位是2或者3。

状态2 –加载Source Manager

Source Manager现在已经被成功地加载到了程序中,但是没有打开Source Manager。

在这个时候, Source Manager开始准备去接受Application的Triplets操作。

状态3 – 打开Source Manager

Source Manager已经打开并且准备去管理Source.Source Manager现在准备向Source发送打开操作,去打开指定的Source,并等待所有针对Source的操作结束后,去关闭打开的Source. Source Manager在会话关闭前,状态位将保持为3. 当Application打开的Source没有关闭时,Source Manager 会拒绝关闭。

 

状态 4 – 打开Source 

在响应Application的一个指定的Triplets操作后,Source被加载到系统中,并且被Source manager 打开。Source在加载前将检测是否有足够的系统资源让自己运行(内存、设备是否可用等等…)。 Application不仅可以查询Source的性能参数(当前解析度、是否支持彩色或黑白图像、自动文档传送是否可用), Application还可以去设置的Source的性能参数。比如,Application可以要求Source按指定的分辨率传输黑白图像。

注意: 可以在Source的状态位是4, 5, 6, 或 7时,去查询Source的性能参数。但是要想设置Source的性能参数必须在状态位是4的时候设置,除非Application和Source有特殊的约定,否则在标志位为其他数的时候都不可以进行性能参数设置。

状态 5 – Source可用

现在可以让Source工作了,此时Source开始为数据传输做准备。在该状态下,可以执行一个Triplets操作,用以选择是否让Source显示它自己的用户界面(Source提供的软件界面)。当Source准备好给Application传输数据时,标志位就从5变为6了。

 

状态 6 –准备数据传输

该状态下,Source已经准备好了为Application传输数据。在传输工作开始前,Application应该查询将要被传输的图像的相关信息(分辨率,图像大小…), 如果Source还要传输音频数据, 那么在传输图像数据前,Application必须要把所有的音频数据先传完。注:某些数码相机带有摄像功能,可以记录一些声音信息。

状态 7 –传输开始 

Source开始进行数据传输,它把获得的数据传输给你的应用程序。 传输工作要么成功完成,要么提前中止。在传输工作完成后, Source将会发送一个返回代码去表示传输工作的最终结果。

转载于:https://blog.51cto.com/chujiu/851917

Twain 学习纪录相关推荐

  1. TWAIN学习笔记006 探索TWAIN之DS连接及扫描

    前一篇中我们已经成功连接了DSM并找到了所有可用的DS.本文中我们试着连接其中一个DS并完成一次扫描. 第一步,选择并连接一个DS,将TWAIN状态由3转到4. 注:本文选用了测试用的DS - TWA ...

  2. MYSQL实践基础-快速入门学习-纪录

    MYSQL-DML语句学习纪录与总结实践. 登录数据库 查看数据库列表:show databases; 这样就显示出了,数据库中 默认的数据库列表. 默认的就不要动了,我们创建一个新的数据库吧. 创建 ...

  3. ISO27001 LA学习纪录

    0x00 背景说明 自2005年国际标准化组织(简称:ISO)将BS 7799转化为ISO 27001:2005发布出来,在国际上获得了空前的认可,相当数量的组织采纳并进行了信息安全管理体系的认证.近 ...

  4. TWAIN学习笔记004 TWAIN砖头交互

    前方提到TWAIN的三大组成元素或者砖头(数据源控制DSM,数据源DS,应用程序APP)通过TWAIN协议做交流.而事实上的交流其实仅仅通过两个出入口(Entry Point)就实现了.这两个口子分别 ...

  5. TWAIN学习笔记003 TWAIN之用户图形界面

    TWAIN作为一种协议,是个抽象的存在.实际应用中,用户需要通过用户界面来使用相关的应用程序和设备.在最基础的层面上,上一篇文章1中提到的源管理程序DSM和源Source都有默认的UI. DSM的UI ...

  6. node实战学习纪录

    1. url模块 2. querystring模块 //序列化 querystring.stringify({name:'scott',course:['jade','node'],from:''}) ...

  7. php socket 心跳机制,socket学习纪录2: workerman 心跳功能实现

    心跳及作用 所谓心跳,就是客户端每隔一段时间向服务端发送一段任意的数据,证明客户端还在. 长连接应用必须加心跳,否则连接可能由于长时间未通讯被路由节点强行断开. 心跳作用主要有两个: 1.客户端定时给 ...

  8. C/C++实现微信跳一跳辅助(学习纪录)

    在python 冒出微信跳一跳的辅助程序后,跳一跳的分数分分钟上个一千几百不成问题.本人在校大学生一名,对于python语言尚未熟悉,,C/C++还是学得半桶水的样子,更不用说有多了解python如此 ...

  9. Twain的学习记录和基于Qt的相关开源项目详解

    Twain学习记录和基于Qt的开源项目详解 twpp-qml 适用于 C++11 及更高版本的便携式.仅标头 TWAIN 框架. 原项目作者使用Qtwidget基于Twain静态传输一张图片 我基于h ...

最新文章

  1. 算法和编程面试题精选TOP50!(附代码+解题思路+答案)
  2. 不想被英文文献烧脑的时候, 如何轻松掌握行业最新进展?
  3. 用 JS 做一个数独游戏(二)
  4. 动态规划—完全背包问题
  5. jboss数据源配置
  6. 大量开发者会将访问token和API密钥硬编码至Android应用
  7. C++11 Primer Plus(三)之名称空间与类
  8. java输出hello word,教你如何配置java环境输出"hello word!"?
  9. mysql query语句_使用mysql_query()函数执行SQL语句
  10. adb dumpsys 查看手机内存
  11. oracle+11g+32位数据库能导入到64位么,Oracle 11G数据库导出问题解决
  12. python操作crontab定时任务
  13. 国外量化投资的经典案例
  14. 系统传输过程中 中文点 · 对方无法解析的问题查找
  15. HTML标签与CSS样式
  16. 提升大模型研究应用技能:第2期前沿讲习班报名,顶尖专家面授,多角度系统培训...
  17. 计算机毕业设计SSM大学生校园社团管理系统【附源码数据库】
  18. 关于——Git命令大全
  19. java 有五个学生_《Java程序设计》 创建5个学生对象,给一个学生数组赋值,每个学生属性有:学号,姓名,年龄。...
  20. 第15讲 布尔函数标准型及化简

热门文章

  1. fedora yum Another app is currently holding the yum lock
  2. c#利用反射+特性实现简单的实体映射数据库操作类实现自动增删改查(一)
  3. WPF--动态添加控件、访问控件
  4. JavaScript特点、优缺点及常用框架
  5. Azure SQL 数据库最新版本现已提供预览版
  6. jQuery ajax - ajax()
  7. java 面向对象个人理解
  8. 解决vs新建项目是模板丢失的问题
  9. Ubuntu安装vmtools
  10. $_FILE函数总结