TWAIN学习笔记.docx
- 文档编号:25926260
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:66
- 大小:50.92KB
TWAIN学习笔记.docx
《TWAIN学习笔记.docx》由会员分享,可在线阅读,更多相关《TWAIN学习笔记.docx(66页珍藏版)》请在冰豆网上搜索。
TWAIN学习笔记
2008-10-06
TWAIN学习笔记(壹)
∙TWAIN,定义了一套标准的软件协议(softwareprotocol)和应用程序编程接口(applicationprogramminginterface(API))。
使用它实现软件应用程序和图象获取设备(扫描仪)之间的通讯。
我们见到的情况是:
从FILE菜单下选取ACQUIRE就弹出了扫描软件。
四层:
Application,Protocol,Acquisition,Device
∙用户层,用户的应用程序,界面之类的东西
∙协议层,把用户的请求转换成TWAIN明白的内容
∙请求层,向下请求内容,可以是硬件也可以是数据库
∙硬件层,数据的来源
TWAIN之间通讯通过两个入口,DSM_Entry,DS_Entry
Application:
所有的应用不能直连到数据层,只能通过SourceManager,通过DSM_Entry()方法。
DSM_Entry()方法有下面的参数:
∙标识符构造,identifierstructure
∙目标(SourceManager或者Source)
∙三个描述
o数据组(DataGroup:
DG_)
oDataArgumentType(DAT_)
oMessage(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_UINT16FARPASCALDSM_Entry(
pTW_IDENTITYpOrigin,//sourceofmessage
pTW_IDENTITYpDest,//destinationofmessage
TW_UINT32DG,//datagroupID:
DG_xxxx
TW_UINT16DAT,//dataargumenttype:
DAT_xxxx
TW_UINT16MSG,//messageID:
MSG_xxxx
TW_MEMREFpData//pointertodata
);
SourceManager:
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_UINT16FARPASCALDS_Entry(
pTW_IDENTITYpOrigin,//sourceofmessage
TW_UINT32DG,//datagroupID:
DG_xxxx
TW_UINT16DAT,//dataargumenttype:
DAT_xxxx
TW_UINT16MSG,//messageID:
MSG_xxxx
TW_MEMREFpData//pointertodata
)
Source:
返回值前缀TWRC_,如果出问题,设置一个前缀为TWCC_的状态码,但是不会自动返回。
SM和S在Win下都是DLL形式实现。
从Source返回给Application,需要4步:
∙通知应用层,已经准备好了有东西要返回了。
MSG_XFERREADY用于Source通知App
∙禁用Source的用户接口,MSG_CLOSEDSREQ
∙通知应用层,按下了OK按钮,应用更改,用于Source被DG_CONTROL/DAT_USERINTERFACE/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.SMLoaded ----> 3.SMOpened ----> 4.SourceOpen ---->
SMnotloaded App:
GetEntrypoint User:
SelectSource CapabilityNegotiation
5.SourceEnable ----> 6.TransferReady ----> 7.Transferring
Source:
ShowUser App:
InquireImage Source:
TransferData
Interface orAudioInformation
看英文资料精疲力竭……还阳中……
TWAIN学习笔记(贰)
TWAIN
能力分成三组:
∙CAP_XXX:
适用于一般的数据源
∙ICAP_XXX:
适用于图形图像源
∙ACAP_XXX:
适用于声音数据源
能力容器分成四类:
∙TW_ONEVALUE:
单值
∙TW_ARRAY:
多值
∙TW_RANGE:
范围值
∙TW_ENUMERATION:
枚举值
<上面数据类型很烦,自己看说明去吧>
有三种方法将Source传递到应用程序。
native,diskfile,bufferedmemory。
音频文件只支持native和diskfile。
Native:
所有的Source都必须支持的模式,但是有限制性(例如限制于DIB或者PICT格式,受可用内存的限制),Win下,DIB格式(Device-IndependentBitmap),Source给文件分配一个内存块,将指针返回给应用,应用负责转换数据之后释放这块内存。
DiskFile:
推荐Source支持这种模式,应用程序创建一个Source支持格式的文件,易于读写,尤其是可以避免遇到内存问题。
稍微比之后讨论的Buffered模式慢,但比他好操作,并且之后应用程序要操作清理这个文件。
BufferedMemory:
所有的Source必须支持该模式。
MD,被关闭了,没保存。
通过一个或多个缓存来实现传输,应用层来分配内存的使用和释放。
数据以一无格式位图(unformattedbitmap)传输,应用需要在传输过程中(TW_IMAGEINFO&TW_IMAGEMEMXFER)用信息标识各个缓存和正确识别位图。
于Native和DiskFile的一个动作结束传输相比,这种模式可能要多次循环。
应用层实现:
TWAIN的实现层次:
∙最小实现:
使用TWAIN默认的,只在Native本机模式,请求单独一个图片。
∙基本实现:
∙最大实现:
安装SM(SourceManager)软件:
TWAINWorkingGroup(TWG)给Win提供四个包:
∙TWAIN_32.DLL:
32位程序用
∙TWAIN.DLL:
16位程序用
∙TWUNKER_32.EXE:
让16位应用程序链接32位的数据源
∙TWUNKER_16.EXE:
让32位应用程序链接16位源,注意,16位源不能再NT上面正确运行
SM四个文件Win文件夹下,比如C:
\Winnt,C:
\Windows.
微软提供了一个VER.DLL包,用于安装SM。
VER.DLL,VER.LIB,VER.H包括在安装包Toolkit里面。
VER.DLL是可以自由使用和发布的。
TWAIN要开始,要做三个准备:
∙添加应用的用户接口用来选择数据源和请求菜单选择:
必须有选择源(SelectSource...和Acquire...)
∙将TWAIN.H引用到程序中:
包括所有必须的定义
∙更改应用的事件循环:
可以开很多个源,但是每次只能持有一个。
o传递事件给Source
o通知应用,源准备好了或者关闭接口
o硬件事件发生的时候通知应用。
三个目标的实现如下:
——————靠——————
下面全都是具体实现,不想弄了。
——————靠——————
算了,复制粘贴一下。
谁帮个忙。
第一个目标,传递事件(从应用到源):
只要源激活了,为了确保源能接受和执行事件,应用必须将所有事件,在源激活期间,统统传过去。
如:
DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT
TW_EVENT结构如下:
C代码
1.typedef struct {
2. TW_MEMREF pEvent; /* Windows pMSG or MAC pEvent */
3. TW_UINT16 TWMessage; /* TW message from Source to */
4. /* the application */
5.} TW_EVENT, FAR *pTW_EVENT;
typedefstruct{
TW_MEMREFpEvent;/*WindowspMSGorMACpEvent*/
TW_UINT16TWMessage;/*TWmessagefromSourceto*/
/*theapplication*/
}TW_EVENT,FAR*pTW_EVENT;
pEvent在Win下,指向messagestructure。
源从SM接收到信息,决定是否属于它,
∙如果是:
源执行事件,然后设置返回码为TWRC_DSEVENT,以示它是Source事件,并且设置TW_Event结构的TWMessage到MSG_NULL,
∙如果不是:
设置返回码为TWRC_NOTDSEVENT,设置TWMessage到MSG_NULL,应用从DSM_Entry接收到信息,然后在循环里面装作没事情一样执行。
第二和第三个目标,(从源到事件)
当源准备好了, 通知应用,通过TW_EVENT.TWMessage,有下面四个选项:
∙MSG_XFERREADY:
标示数据已经准备好了
∙MSG_CLOSEDSREQ:
关闭Source的用户接口
∙MSG_CLOSEDSOK:
同上,不过只用在DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY
∙MSG_DEVICEEVENT:
报告设备事件发生
Win下,修改循环的例子代码:
C代码
1.TW_EVENT twEvent;
2.TW_INT16 rc;
3.while (GetMessage ( (LPMSG) &msg, NULL, 0, 0) ) {
4. rc = TWRC_NOTDSEVENT;
5. if Source is enabled {
6. twEvent.pEvent = (TW_MEMREF)&msg;
7. twEvent.TWMessage = MSG_NULL;
8. rc = (*pDSM_Entry) (pAppId,
9. pSourceId,
10. DG_CONTROL,
11. DAT_EVENT,
12. MSG_PROCESSEVENT,
13. (TW_MEMREF)&twEvent);
14. // check for message from Source
15. switch (twEvent.TWMessage) {
16. case MSG_XFERREADY:
17. SetupAndTransferImage(NULL);
18. break;
19. case MSG_CLOSEDSREQ:
20. DisableAndCloseSource(NULL);
21. break;
22. case MSG_CLOSEDSOK:
23. DisableAndCloseSource(NULL);
24. GetCustomDsData();
25. break;
26. case MSG_NULL:
27. // no message returned from the source
28. break;
29. }
30. }
31. // Source didn’t process it, so we will
32. if (rc == TWRC_NOTDSEVENT) {
33. TranslateMessage( (LPMSG) &msg);
34. DispatchMessage( (LPMSG) &msg);
35. }
36.}
TW_EVENTtwEvent;
TW_INT16rc;
while(GetMessage((LPMSG)&msg,NULL,0,0)){
rc=TWRC_NOTDSEVENT;
ifSourceisenabled{
twEvent.pEvent=(TW_MEMREF)&msg;
twEvent.TWMessage=MSG_NULL;
rc=(*pDSM_Entry)(pAppId,
pSourceId,
DG_CONTROL,
DAT_EVENT,
MSG_PROCESSEVENT,
(TW_MEMREF)&twEvent);
//checkformessagefromSource
switch(twEvent.TWMessage){
caseMSG_XFERREADY:
SetupAndTransferImage(NULL);
break;
caseMSG_CLOSEDSREQ:
DisableAndCloseSource(NULL);
break;
caseMSG_CLOSEDSOK:
DisableAndCloseSource(NULL);
GetCustomDsData();
break;
caseMSG_NULL:
//nomessagereturnedfromthesource
break;
}
}
//Sourcedidn’tprocessit,sowewill
if(rc==TWRC_NOTDSEVENT){
TranslateMessage((LPMSG)&msg);
DispatchMessage((LPMSG)&msg);
}
}
DSM_Entry()方法:
Win下代码如下:
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_UINT16FARPASCALDSM_Entry(
pTW_IDENTITYpOrigin,//sourceofmessage
pTW_IDENTITYpDest,//destinationofmessage
TW_UINT32DG,//datagroupID:
DG_xxxx
TW_UINT16DAT,//dataargumenttype:
DAT_xxxx
TW_UINT16MSG,//messageID:
MSG_xxxx
TW_MEMREFpData//pointertodata
);
∙pOrigin:
TW_IDENTITY,从应用和源链接上之后不能改变。
∙pDest:
如果操作最后目标是SM,设置为NULL,否则指向源
∙DG_XXX:
DG_CONTROL,DG_IMAGE,DG_AUDIO目前是被定义掉了的,可以自定义数据组。
∙DAT_XXX:
描述pData对象的唯一标示(结构或者变量)
∙MSG_XXX:
动作的描述
∙pData:
操作用到的TW_XXX结构或者变量,类型有DAT_XXX描述。
Therearenineoperationtripletsthatcanbesentfromtheapplicationtobeconsumedbythe
SourceManager.
有九个手术双胞胎,可发出的申请将消费源管理器。
从应用到SM,(我们公司的人事很有味道
),DG统统属于DG_CONTROL,DAT有三个:
DAT_IDENTITY,DAT_PARENT,DAT_STATUS。
下面的列表是DAT下面的MSG组合:
DG_CONTROL/DAT_IDENTITY
MSG_CLOSEDS:
准备关闭源
MSG_GETDEFAULT:
获取默认源的标识信息
MSG_GETFIRST:
获取第一个活动源的标识信息
MSG_GETNEXT:
获取下一个活动源的标识信息
MSG_OPENDS:
装载且初始化源
MSG_USERSELECT:
弹出“选择源”的对话框
DG_CONTROL/DAT_PARENT
M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TWAIN 学习 笔记