TWAIN 操作教程

 

 

一、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依靠三个组件协同完成与图像设备的通讯和数据传输工作,这三个组件就是 ApplicationSource ManagerSource

 

组件

说明

Application

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

Source Manager

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

Source

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

 

它们的层次结构图如下:

 

 

 

从该图我们可以看到,Application要从Source获得图像数据,必须通过Source Manager传递来实现。ApplicationSource Manager 间的通讯是靠调用TWAIN提供的DSM_Entry( )函数实现。而Application不能直接与Source 通讯,Source ManagerSource 间的通讯是靠调用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              //* 指向返回数据块的指针

);

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

    对于每个Triplets操作,都是由DGDATMSG三个参数组合构成的。pOriginpDest参数会根据不同的Triplets操作,而使用不同的值。

函数执行后会返回一个值来表示操作是否成功。如果返回值为TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失败。同样根据Triplets操作的类型不同,还会有其他的返回值。比如TWRC_CANCELTWCC_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 – 准备会话

ApplicationSource Manager建立会话前,Source Manager的标志位是1.

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

 

状态2 –加载Source Manager

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

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

 

状态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的时候设置,除非ApplicationSource有特殊的约定,否则在标志位为其他数的时候都不可以进行性能参数设置。

 

状态 5 Source可用         

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

 

状态 6 –准备数据传输

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

 

状态 7 –传输开始       

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值