2008-10-06
TWAIN学习笔记(壹)
∙ TWAIN,定义了一套标准的软件协议(software protocol)和应用程序编程接口 (application programming interface(API))。使用它实现软件应用程序和图象获取设备(扫描仪)之间的通讯。我们见到的情况是:从FILE菜单下选取ACQUIRE就弹出了扫描软件。
四层:
Application,Protocol,Acquisition,Device
∙ 用户层,用户的应用程序,界面之类的东西
∙ 协议层,把用户的请求转换成TWAIN明白的内容
∙ 请求层,向下请求内容,可以是硬件也可以是数据库
∙ 硬件层,数据的来源
TWAIN之间通讯通过两个入口,DSM_Entry,DS_Entry
Application:
所有的应用不能直连到数据层,只能通过SourceManager,通过DSM_Entry()方法。
DSM_Entry()方法有下面的参数:
∙ 标识符构造,identifier structure
∙ 目标(SourceManager或者Source)
∙ 三个描述
o 数据组(Data Group : DG_)
o 工程造价开题报告Data Argument Type(DAT_)
o Message(MSG_)
∙ 用于传数据的指针域
Win下,C代码类似于:
C代码
1. TW_UINT16 FAR PASCAL DSM_Entry(
2. pTW_IDENTITY pOrigin, // source of message
3. pTW_IDENTITY pDest, // destination of message
4. TW_UINT32 DG, // data group ID: DG_xxxx
5. TW_UINT16 DAT, // data argument type: DAT_xxxx
6. TW_UINT16 MSG, // message ID: MSG_xxxx
7. 鳕鱼汤 TW_MEMREF pData // pointer to data
8. );
TW_UINT16 FAR PASCAL 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
);
高薪职位
Source Manager:
SM提供应用层和数据层之间的通讯,支持用户选取数据源,应用层读取数据源。如果用DSM_Entry()的时候,调用的是SM,那直接就操作它本身。如果调用的是S,那再调用DS_Entry()。
Win下面,C代码类似于:
C代码
1. TW_UINT16 FAR PASCAL DS_Entry(
向日葵作文
2. pTW_IDENTITY pOrigin, // source of message
3. TW_UINT32 DG, // data group ID: DG_xxxx
4. 男士面部护理 TW_UINT16 DAT, // data argument type: DAT_xxxx
5. TW_UINT16 MSG, // message ID: MSG_xxxx
6. TW_MEMREF pData // pointer to data
7. )
TW_UINT16 FAR PASCAL DS_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
)
Source:
返回值前缀TWRC_,如果出问题,设置一个前缀为TWCC_的状态码,但是不会自动返回。
SM和S在Win下都是DLL形式实现。
从Source返回给Application,需要4步:
∙ 通知应用层,已经准备好了有东西要返回了。MSG_XFERREADY用于Source通知App
∙ 禁用Source的用户接口,MSG_CLOSEDSREQ
∙ 抑郁症是怎么引起的通知应用层,按下了OK按钮,应用更改,用于Source被DG_CONTROL /DAT_USERINT
ERFACE / MSG_ENABLEDSUIONLY.打开的情况,MSG_CLOSEDSOK
∙ 设备发生动作,只有在应用层给数据层这个优先权,单独传回来。MSG_DEVICEEVENT
DSM_Entry()和DS_Entry()用于通讯,一个操作和一个应用或者SM关联。通常,但不绝对,用传进来的最后一个参数(pData)来描述。
从app到SM,设为NULL,从app到S(通过SM),设为目标id,从SM到S,设为DS_Entry。
传进来的三个参数DG,DAT,MSG表示的意思如下:
世界文化遗产丽江DG_XXXX:
∙ DG_CONTROL 用于TWAIN操作动作,例如打开SM
∙ DG_IMAGE 用于操作图形图像操作
∙ 国家规定的安全色DG_AUDIO 用于操作声频数据
DAT_XXX:
传进来的参数,可以引用一个结构体或者变量,例如DAT_IDENTITY,还有类似于TW_XXX的声明。
MSG_XXX:
用于确定动作,都是类似于MSG_GET,MSG_SET的有前缀MSG_开始的。
三个例子:
打开SM模块:DG_CONTROL/DAT_PARENT/MSG_OPENDSM
打开对话框,让用户可以选择Source:DG_CONTROL/DAT_IDENTITY/MSG_USERSELECT
导一个图像到文件上:DG_IMAGE/DAT_IMAGEFILEXFER/MSG_GET
协议层被分为7个阶段:
[1,2,3]在且只在SM阶段,[4,5,6,7]在且只在S阶段。
举例说:
1.Pre-Session ----> 2.SM Loaded ----> 3.SM Opened ----> 4.Source Open ---->
SM not loaded App:Get Entry point Ur:Select Source Capability Negotiation
5.Source Enable ----> 6.Transfer Ready ----> 7.Transferring
Source:Show Ur App:Inquire Image Source: Transfer Data
Interface or Audio Information
看英文资料精疲力竭……还阳中……
TWAIN学习笔记(贰)
TWAIN
能力分成三组:
∙ CAP_XXX:适用于一般的数据源
∙ ICAP_XXX:适用于图形图像源
∙ ACAP_XXX:适用于声音数据源
能力容器分成四类:
∙ TW_ONEVALUE:单值
∙ TW_ARRAY:多值
∙ TW_RANGE:范围值
∙ TW_ENUMERATION:枚举值
<上面数据类型很烦,自己看说明去吧>
有三种方法将Source传递到应用程序。native, disk file, buffered memory。音频文件只支持native和disk file。
Native:所有的Source都必须支持的模式,但是有限制性(例如限制于DIB或者PICT格式,受可用内存的限制),Win下,DIB格式(Device-Independent Bitmap),Source给文件分配一个内存块,将指针返回给应用,应用负责转换数据之后释放这块内存。
Disk File:推荐Source支持这种模式,应用程序创建一个Source支持格式的文件,易于读写,尤其是可以避免遇到内存问题。稍微比之后讨论的Buffered模式慢,但比他好操作,
并且之后应用程序要操作清理这个文件。
Buffered Memory:所有的Source必须支持该模式。
MD,被关闭了,没保存。
通过一个或多个缓存来实现传输,应用层来分配内存的使用和释放。数据以一无格式位图(unformatted bitmap)传输,应用需要在传输过程中(TW_IMAGEINFO&TW_IMAGEMEMXFER)用信息标识各个缓存和正确识别位图。于Native和Disk File的一个动作结束传输相比,这种模式可能要多次循环。
应用层实现:
TWAIN的实现层次:
∙ 最小实现:使用TWAIN默认的,只在Native本机模式,请求单独一个图片。
∙ 基本实现:
∙ 最大实现:
安装SM(Source Manager)软件:
TWAIN Working Group(TWG)给Win提供四个包: