TWAIN驱动详解
TWAIN驱动详解
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位数据源进行通讯,它运行时不可见。
注意:在WindowsNT环境下16位数据源不能够正常工作。
Windows操作系统中(Windows9x/2000/XP)Microsoft已经把这些文件作为系统文件随同操作系统一起发布了。你可以在Windows安装目录中查到这些文件。如果我们要编程来实现对TWAIN的访问,还需要最重要的头文件。你通过访问该/devfiles/twain.h地址来获得TWAIN提供的头文件。
好了,现在就让我们来了解一下TWAIN的结构吧。
TWAIN的结构
TWAIN依靠三个组件协同完成与图像设备的通讯和数据传输工作,这三个组件就是ApplicationSourceManagerSource
组件
说明
Application
就是你要编写的应用程序。
SourceManager
是由TWAIN提供的一个Source的管理器,它不仅可以收集本地系统已经安装了的图像设备,还可以根据需要去加载设备。同时,它最重要的功能是担任ApplicationSource通讯的桥梁。(其实,它就是我们前面提到的组成文件中的dll文件。)
Source
在这里可以看作是图像设备。事实上它是由设备厂家提供的一个dll文件。这个dll文件是支持twain接口的。(该文不讨论关于twainSource中的应用。)
它们的层次结构图如下:
从该图我们可以看到,Application要从Source获得图像数据,必须通过SourceManager传递来实现。ApplicationSourceManager间的通讯是靠调用TWAIN提供的DSM_Entry()函数实现。而Application不能直接与Source通讯,SourceManagerSource间的通讯是靠调用TWAIN提供的DS_Entry()函数实现(在这里,我们不用关心SourceManager如何去调用DS_Entry函数。)。
TWAIN的用户界面
当我们使用TWAIN接口去获得图像数据的时候,会涉及到一些的用户界面,首先是我们的应用程序界面,然后是SourceManager提供的用户界面以及图像设备(Source)所提供的用户界面。
这些用户界面如下:
在我们的应用程序中,可以通过选择设备来打开SourceManager的标准用户界面。SourceManager的界面由SourceManager提供。在这个界面中可以让用户选择他想要使用的图像设备。选中想要的设备后,再通过获取…”来打开图像设备(Source)提供的用户界面进行现应的操作。(注:Source提供的界面会因为你使用的图像设备不同而有差异。)
对于这些界面,TWAIN提供了非常灵活的处理方法。对于SourceManager提供的用户界面以及图像设备(Source)所提供的用户界面,我们可以选择是否显示它们,甚至我们还可以按自己的要求去改写这些用户界面。
TWAIN的接口函数
要编写应用程序实现与支持TWAIN标准的图像设备通讯,只需要了解上面提到的DSM_Entry()接口函数。TWAIN定义了大约140个操作消息。你只要把这些消息通过DSM_Entry()函数发给SourceManager,就可以实现对选定的Source进行相应的操作。SourceManager会分辨那些消息属于自己,那些消息是该转发给Source
在介绍DSM_Entry()前,我们先来了解一下的TWAIN定义的消息格式。TWAIN把它定义的操作称为Triplets操作,就是每个操作用三个定义的参数来表示。这个三个参数用不同前缀名来区分。每个Triplets操作都是唯一的,不会有歧意,它们代表一个特定的操作行为。这三个参数类型分别是DataGroup(前缀名DG_)抠图DataArgument(前缀名DAT_)MessageID(前缀名MSG_),每个参数都包含有各自的信息。比如:DG_CONTROL/DAT_PARENT/MSG_OPENDSM就表示一个打开SourceManager的操作,这些参数在TWAIN.H中都有定义。其他的操作(设置扫描仪的分辨率、获得设备支持的功能等等…)你可以去查看TWAIN的参考手册,我将在后面编程应用中介绍几个最常用的操作。
现在,我们明白了TWAIN定义的Triplets操作,但是这还不够。在使用DSM_Entry()前,必须要加载TWAIN_32.DLL文件以获得DSM_Entry()函数指针。(注意:在你程序中应该添加前面提到的TWAIN.H头文件哦!)
DSMENTRYPROClpDSM_Entry;//*DSM_Entry入口函数的指针
HMODULEhDSMDLL;//*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_UINT16FARPASCALDSM_Entry
(pTW_IDENTITYpOrigin,//*指向操作发起者的指针
pTW_IDENTITYpDest,//*指向目标对象的指针
国庆高速免费时间
TW_UINT32DG,//*Triplets操作的山有木兮木有枝 心悦君兮君不知什么意思DG参数:DG_xxxx
TW_UINT16DAT,//*Triplets操作的DAT参数:DAT_xxxx
TW_UINT16MSG,//*Triplets操作的MSG参数:MSG_xxxx
TW_MEMREFpData//*指向返回数据块的指针
);
其中DGDATMSG参数表示一个你想执行的Triplets操作。pOrigin表示发起Triplets操作的对象。pDest表示接收Triplets操作的对象。pData用于获得执行Triplets操作后返回的数据。
对于每个Triplets操作,都是由DGDATMSG三个参数组合构成的。pOriginpDest参数会根据不同的Triplets操作,而使用不同的值。
函数执行后会返回一个值来表示操作是否成功。如果返回值为TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失败。同样根据Triplets操作的类型不同,还会有其他的返回值。比如TWRC_CANCELTWCC_LOWMEMORY…,具体信息你可以参考TWAIN的说明手册。
TWAIN的操作流程
ApplicationSourceManager女生报考什么专业好Source要实现数据传输,必须遵循一个操作流程。你要进行的操作应该在这个流程规定的动作队列中按逻辑去执行。比如,在没有加载SourceMan
ager前,Application是不能要求Source传输数据的。为了更好的去描述这个流程,TWAIN为该流程定义了7个状态(1-7)
不要以为整个流程很复杂,只要记住这些下面这些状态位,对于理解流程和以后的编程应用都是很有用的。
l状态位1,2,3
这几个状态是用于描述SourceManager的,它们是SourceManager专有的状态位,所以SourceManager的标志位是不会大于3.
l状态位4,5,6,7
这几个状态是Source专有的。如果Source打开了,Source的标志位就不会小于4;如果Source关闭了,Source就没有了标志位。
要注意,我们的应用程序可以使用了多个Source,每个与Source的连接都是一个单独的会话,对于打开的每个Source,他们的标志位都是相互独立的,不互相关联。现在就来看看流程图。
流程标志位说明
状态1–准备会话
ApplicationSourceManager建立会话前,SourceManager的标志位是1.
在这个时候,SourceManager还没有被加载到内存中。如果SourceManager被加载到内存中,则状态位是2或者3
状态2–加载SourceManager
SourceManager现在已经被成功地加载到了程序中,但是没有打开SourceManager
在这个时候,SourceManager开始准备去接受ApplicationTriplets操作。
状态3–打开SourceManager
SourceManager已经打开并且准备去管理Source.
SourceManager现在准备向Source发送打开操作,去打开指定的Source,并等待所有针对
Source学前教育专业的学校的操作结束后,去关闭打开的Source.
SourceManager在会话关闭前,状态位将保持为3.
Application打开的Source没有关闭时,SourceManager会拒绝关闭。
状态4–打开Source
在响应Application的一个指定的Triplets操作后,Source被加载到系统中,并且被惠普打印机驱动下载Sourcemanager打开。Source在加载前将检测是否有足够的系统资源让自己运行(内存、设备是否可用等等…)Application不仅可以查询Source的性能参数(当前解析度、是否支持彩或黑白图像、自动文档传送是否可用),Application还可以去设置的Source的性能参数。比如,Application可以要求Source按指定的分辨率传输黑白图像。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。