从 TWAIN 设备中扫描图像_第1页
从 TWAIN 设备中扫描图像_第2页
从 TWAIN 设备中扫描图像_第3页
从 TWAIN 设备中扫描图像_第4页
从 TWAIN 设备中扫描图像_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、简介TWAIN 数据源管理程序 (DSM) 工业标准的软件库,用于从静态图像设备提取图像。绝大部分的扫描仪和数码相机都提供了 TWAIN 驱动程序,利用统一的 TWAIN 接口,应用程序可以非常方便地从这些设备中获取图像。二、使用步骤互联网上关于 TWAIN 编程的中文资料很少,代码更是难找到,因为我不得不仔细阅读了 / 提供的 TWAIN Specification。下面说说使用 TWAIN 接口获取图像的简要步骤。 Windows 系统中存在一个 TWAIN_32.dll,所有的 TWAIN 操作都是通过这个 DLL

2、导出的 DSM_Entry 函数来实现的 (说实在话,我个人觉得 TWAIN 接口设计得太差了,看看 MS 的WIA,逻辑上非常清晰)。这个函数的声明如下: TW_UINT16 FAR PASCAL DSM_Entry(pTW_IDENTITY pOrigin, / Source of messagepTW_IDENTITY pDest, / Destination of messageTW_UINT32 DG, / Data group ID: DG_xxxxTW_UINT16 DAT, / Data argument type: DAT_xxxxTW_UINT16 MSG, /

3、Message ID: MSG_xxxxTW_MEMREF pData / Pointer to data); 1. 打开 DSM (Data Source Manager: 数据源管理器) TWAIN 是一个数据源管理程序,应用程序首先要使用 MSG_OPENDSM 消息,打开数据源管理器。这里需要指定一个窗口句柄,应用程序应该在此窗口的消息循环中处理 TWAIN 消息 (MSG_PROCESSEVENT)。 2. 选择 DS (Data Source: 数据源) 因为一个系统中可能存在多个 TWAIN 设备,因此必须选择一个数据源。选择数据源通常有两

4、种方式: 选择默认数据源 (MSG_GETDEFAULT) 和显示选择数据源对话框,由用户来选择数据源 (MSG_USERSELECT)。 3. 打开 DS 使用 MSG_OPENDS 消息打开数据源。 4. 设置参数 消息为 MSG_SET,设置各种参数,如获取方式、图像数量等。有些参数由设备驱动支持才有效。 5. 显示扫描界面 使用 MSG_ENABLEDS 消息,显示设备驱动提供的用户界面 (UI)。 6. 获取图像 如果用户选择扫描什么的,可以在窗口的消息循环中获取到这个事件 (MSG_XFERREADY)

5、。此时,应用程序可以通过 DAT_SETUPFILEXFER 设置文件名,然后用 DAT_IMAGEFILEXFER 获取图像到文件中。 7. 关闭扫描界面 在窗口的消息循环中获取到 MSG_CLOSEDSREQ 或 MSG_CLOSEDSOK 消息,可以关闭扫描界面 (MSG_DISABLEDS)。 8. 关闭 DS 消息为 MSG_CLOSEDS。 9. 关闭数据源消息为 MSG_CLOSEDSM。 三、CTwainHelper 助手类为了使用方便,我写了一个静态 TWAIN 助手类 CTwainHelper。使用 CTwainH

6、elper 的五个函数,就可以简单地从 TWAIN 设备获取图像到文件中。使用方法如下:1. 调用 CTwainHelper:Initialize() 确定是否有可用的设备。2. 在窗口消息循环中,调用 CTwainHelper:ProcessMessage() 处理 TWAIN 消息。3. 要获取图像时,调用 CTwainHelper:GetImage()。4. 如果图像已准备好 (如用户确定扫描图像),窗口会收到 WM_COMMAND 消息,wParam 为 IDC_TwainHelper。此时应用程序可以调用 CTwainHelper:TransferImage() 获取图像到文件中。具

7、体使用方法请参看示例代码。CTwainHelper 可以在 Visual C+ 6.x/7.x 工程中使用,支持 UNICODE 编译。因为是静态类,要改写成 C 代码只需要做一点点少量的工作。四、后话当然,上面只是一种常用的步骤。其实应用程序完全可以自定义所有的步骤,比如不使用 TWAIN 驱动提供扫描对话框而直接扫描,或者扫描图像到内存中等等。详细情况请参考 TWAIN Specification,步骤大同小异,消息和参数千差万别,仔细看看应该很容易的。如果没有 TWAIN 设备又要进行 TWAIN 程序开发,可以到 TWAIN 官方网站下载 TWAIN Developers Toolki

8、t,安装后会有一个虚拟的 TWAIN 设备。不过应用程序在这个虚拟 TWAIN 设备中正常工作,不代表一定能在实际的 TWAIN 设备正常使用,这点需要注意。以前 CTwainHelper 就碰到过这样的情况 在虚拟 TWAIN 设备中明明是好的,在我的扫描仪上却不能扫描图像。检查后发现,原来设置了不支持的参数。最后,TWAIN 是 Technology Without A Interesting Name 缩写,直译为没有“没有让人感兴趣名字的技术”,真是一个让人摸不着头脑的名字。TWAIN 助手类: CTwainHelper (包含示例代码 35K)TWAIN 官方网站

9、: TWAIN 头文件: /devfiles/twain.hTWAIN Specification: /docs/Spec1_9_197.pdfTWAIN Developers Toolkit: /devfiles/twainkit.exe 2006.2.22 下面是更简单的版本,其中的 GetImage 函数内部自动具有消息循环,直到TWAIN对话框完全关闭后才会返回,适合任何场合使用:下载文件点击这里

10、下载文件转 Twain学习  2009-05-03 11:34:07|  分类: C语言学习|字号 订阅一、TWAIN的文件组成TWAIN共包括4个二进制文件。如果要使用该接口,就必须要保证他们被成功地安装在本地计算机上。 文 件 名说 明TWAIN_32.DLL32位应用程序的支持文件,32位程序使用TWAIN通讯必须使用该文件。TWAIN.DLL16位应用程序的支持文件,16位程序使用TWAIN通讯必须使用该文件。TWUNKER_32.EXE实现32位应用程序与32位数据源进行通讯,它运行时不可见。TWUNKER_16.

11、EXE实现32位应用程序与16位数据源进行通讯,它运行时不可见。注意:在Windows NT 环境下16位数据源不能够正常工作。 在Windows 操作系统中(Windows 9x / 2000 / XP ),Microsoft已经把这些文件作为系统文件随同操作系统一起发布了。你可以在Windows安装目录中查找到这些文件。如果我们要编程来实现对TWAIvN的访问,还需要最重要的头文件。你通过访问该/devfiles/twain.h 地址来获得TWAIN提供的头文件。 二、TWAIN的结构TWAIN依靠三个组件协同完

12、成与图像设备的通讯和数据传输工作,这三个组件就是Application、Source Manager和Source。 组件说明Application就是你要编写的应用程序。Source Manager是由TWAIN提供的一个Source的管理器,它不仅可以收集本地系统已经安装了的图像设备,还可以根据需要去加载设备。同时,它最重要的功能是担任Application 与Source通讯的桥梁。(其实,它就是我们前面提到的组成文件中的dll文件。)Source在这里可以看作是图像设备。事实上它是由设备厂家提供的一个dll文件。这个dll文件是支持twain接口的。(该文不讨论关于

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

14、IN的用户界面当我们使用TWAIN接口去获得图像数据的时候,会涉及到一些的用户界面,首先是我们的应用程序界面,然后是Source Manager提供的用户界面以及图像设备(Source)所提供的用户界面。在我们的应用程序中,可以通过“选择设备”来打开Source Manager的标准用户界面。Source Manager的界面由Source Manager提供。在这个界面中可以让用户选择他想要使用的图像设备。选中想要的设备后,再通过“获取”来打开图像设备(Source)提供的用户界 面进行现应的操作。(注:Source提供的界面会因为你使用的图像设备不同而有差异。)对于这些界面,TWAIN提供

15、了非常灵活的处理方法。对于Source Manager提供的用户界面以及图像设备(Source)所提供的用户界面,我们可以选择是否显示它们,甚至我们还可以按自己的要求去改写这些用户界面。 四、TWAIN的接口函数要编写应用程序实现与支持TWAIN 标准的图像设备通讯,只需要了解上面提到的DSM_Entry()接口函数。TWAIN定义了大约140个操作消息。你只要把这些消息通过 DSM_Entry()函数发给Source Manager,就可以实现对选定的Source进行相应的操作。Source Manager会分辨那些消息属于自己,那些消息是该转发给Source。在介绍DSM_Ent

16、ry() 前,我们先来了解一下的TWAIN定义的消息格式。TWAIN把它定义的操作称为Triplets操作,就是每个操作用三个定义的参数来表示。这个三个参 数用不同前缀名来区分。每个Triplets操作都是唯一的,不会有歧意,它们代表一个特定的操作行为。这三个参数类型分别是Data Group(前缀名DG_ )、 Data Argument(前缀名DAT_ ) 和 Message ID(前缀名MSG_ ),每个参数都包含有各自的信息。比如:DG_CONTROL / DAT_PARENT / MSG_OPENDSM 就表示一个打开Source Manager的操作,这些参数在TWAIN

17、.H中都有定义。其他的操作(设置扫描仪的分辨率、获得设备支持的功能等等)你可以去查看TWAIN的参考手册,我将在后面编程应用中介绍几个最常用的操作。现在,我们明白了TWAIN定义的Triplets操作,但是这还不够。在使用DSM_Entry()前,必须要加载TWAIN_32.DLL文件以获得DSM_Entry()函数指针。(注意:在你程序中应该添加前面提到的TWAIN.H头文件哦!)DSMENTRYPROC lpDSM_Entry;   /* DSM_Entry 入口函数的指针HMODULE      h

18、DSMDLL;       /* Twain_32.Dll句柄    /* 加载TWAIN_32.DLL 文件if (hDSMDLL = LoadLibrary("TWAIN_32.DLL") != NULL)    if (hDSMDLL)           /* 检查TWAIN_32.DLL是

19、否加载                if ( (lpDSM_Entry =(DSMENTRYPROC) GetProcAddress(hDSMDLL,MAKEINTRESOURCE(1)!=NULL)                   

20、               /* 成功获得 DSM_Entry()函数指针;             现在我们明白了,TWAIN所有的操作都是通过DSM_Entry()函数来实现的,所以了解该入口函数很有必要。它定义如下:TW_UINT16 FAR PASCAL DSM_Entry( pTW_IDENTITY pOr

21、igin,        /* 指向操作发起者的指针pTW_IDENTITY pDest,          /* 指向目标对象的指针TW_UINT32 DG,                /* Triplets 操作的DG参数 : DG_xxxxTW_UI

22、NT16 DAT,               /* Triplets 操作的DAT参数: DAT_xxxxTW_UINT16 MSG,               /* Triplets 操作的MSG参数: MSG_xxxxTW_MEMREF pData   

23、0;          /* 指向返回数据块的指针);    其中DG、DAT、MSG参数表示一个你想执行的Triplets操作。pOrigin表示发起Triplets操作的对象。pDest表示接收Triplets操作的对象。pData用于获得执行Triplets操作后返回的数据。    对于每个Triplets操作,都是由DG、DAT、MSG三个参数组合构成的。pOrigin、pDest参数会根据不同的Triple

24、ts操作,而使用不同的值。函数执行后会返回一个值来表示操作是否成功。如果返回值为TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失败。同样根据Triplets操作的类型不同,还会有其他的返回值。比如TWRC_CANCEL、TWCC_LOWMEMORY,具体信息你可以参考TWAIN的说明手册。   五、TWAIN的操作流程 Application、 Source Manager 和 Source要实现数据传输,必须遵循一个操作流程。你要进行的操作应该在这个流程规定的动作队列中按逻辑去执行。比如,在没有加载Source Manager前

25、,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的连接都是一个单独的

26、会话,对于打开的每个Source,他们的标志位都是相互独立的,不互相关联。现在就来看看流程图。流程标志位说明状态 1 准备会话在Application和Source Manager建立会话前,Source Manager的标志位是1.在这个时候,Source Manager还没有被加载到内存中。如果Source Manager 被加载到内存中,则状态位是2或者3。 状态2 加载Source ManagerSource Manager现在已经被成功地加载到了程序中,但是没有打开Source Manager。在这个时候, Source Manager开始准备去接受Applica

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

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

29、位是4的时候设置,除非Application和Source有特殊 的约定,否则在标志位为其他数的时候都不可以进行性能参数设置。 状态 5 Source可用         现在可以让Source 工作了,此时Source开始为数据传输做准备。在该状态下,可以执行一个Triplets操作,用以选择是否让Source显示它自己的用户界面 (Source提供的软件界面)。当Source准备好给Application传输数据时,标志位就从5变为6了。 状态 6 准备数据传输

30、该状态下,Source 已经准备好了为Application传输数据。在传输工作开始前,Application应该查询将要被传输的图像的相关信息(分辨率,图像大小), 如果Source还要传输音频数据, 那么在传输图像数据前,Application必须要把所有的音频数据先传完。注:某些数码相机带有摄像功能,可以记录一些声音信息。 状态 7 传输开始       Source开始进行数据传输,它把获得的数据传输给你的应用程序。 传输工作要么成功完成,要么提前中止。在传输工作完成后, Source将会发送一个

31、返回代码去表示传输工作的最终结果。 七、TWAIN最常用的Triplets操作这里将对TWAIN中最常用的Triplets操作做一个简单的介绍,为了便于理解和记忆,我将结合前面讲的操作流程顺序去介绍这些常用的Triplets操作。 1加载Source Manager并获得DSM_Entry入口函数 (状态1到2)应用程序在调用DSM_Entry函数指针前必须加载Source Manager。这里没有使用Triplets操作。你可以使用LoadLibrary()函数,加载TWAIN_32.DLL文件。并使用GetProcAddress()函数,获得DSM_Entry函数指针&

32、#160;2打开Source Manager (状态2到3)Triplets 操作:DG_CONTROL / DAT_PARENT / MSG_OPENDSM通过该操作,你可以打开Source Manager,并且还要在你的应用程序中,指定一个窗体作为Source的父窗口。Source Manager 将通过该窗体,把Source的消息传递给你的应用程序。 3选择Source (状态3期间)Triplets 操作:DG_CONTROL / DAT_IDENTITY / MSG_USERSELECT你的应用程序发送该操作后,将显示Source Manager的用户界面,它是一个对话框。

33、这个对话框中显示了系统中所有支持Twain的设备列表。系统默认设备将高亮显示在列表框中。你可以通过该列表框选择你想要的输入设备。 4打开Source (状态3到4)Triplets 操作:DG_CONTROL / DAT_IDENTITY / MSG_OPENDS该操作可以打开你选择的Source(图像输入设备),同时,Source Manager会给该Source分配一个唯一的标识符。你要把打开的这个Source放在一个指定的结构中,以便于在后面和该Source进行通讯。 5设置Source的性能参数 (状态4期间)Triplets 操作:DG_CONTROL / DAT

34、_CAPABILITY / MSG_GETDG_CONTROL / DAT_CAPABILITY / MSG_SET这里有两个Triplets操作,通过使用这两个操作可以去查询当前设备是否支持的某种功能,如果支持,还可以获得设备功能的当前值、默认值、以及可以重新设置的范围。你还可以根据查询的结果,按你的要求去重新设置该功能的当前值。 6请求从Source获取数据 (状态4到5)Triplets 操作:DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS通过该操作,可以让Source显示它的用户界面,Source会去为数据传输作准备。 7

35、认数据准备传输 (状态5到6)Triplets 操作:DG_CONTROL /DAT_EVENT / MSG_PROCESSEVENT首先要说明一下,从状态5到状态6的这个过程,不是由你的应用程序通过Triplets操作来发起的。而是当Source准备好去传输数据时,它会发出一个事件信号来实现的。你的应用程序应该要去检查这个事件信号。如何去检查这个事件信号?我们在加载Source Manager时,就为Source指定了一个父窗口,Source会把它事件信号封装成一个Windows的消息结构发送给它的父窗口。你可以在这个窗 体的消息循环中去,使用 DG_CONTROL /DAT_EVENT /

36、 MSG_PROCESSEVENT操作,来判断Source是否有事件发生。MSG_XFERREADY就表示这个过程的状态位从5变为6了。 8开始进行数据传输 (状态6到7)Triplets 操作:DG_IMAGE / DAT_IMAGEINFO / MSG_GET   DG_IMAGE / DAT_IMAGENATIVEXFER / MSG_GET在开始数据传输前,可以通过 DG_IMAGE / DAT_IMAGEINFO / MSG_GET 操作,去获得将要传输的图像的相关信息,比如位图大小、宽度、长度。通过 DG_IMAGE /

37、DAT_IMAGENATIVEXFER / MSG_GET 操作,可以实现使用本地传输模式去传输数据。传输结束了,Source 将给它的父窗口一个 PM_XFERDONE 的消息。Source将在 DSM_Entry() 中返回为一个指向 DIB 位图的指针。 9中止传输 (状态7到6到5)Triplets 操作:DG_CONTROL / DAT_PENDINGXFERS / MSG_ENDXFER在每次数据传输结束(成功、退出)后,可以发送该操作给Source,去表示应用程序已经接受完了所有的数据了。同时还可以根据它的返回值,去检查是否有其它的图像等待传送。 10断开TW

38、AIN会话 (状态5到4)Triplets 操作:DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS该操作让打开Source失效。 11关闭Source (状态4到3)Triplets 操作:DG_CONTROL / DAT_IDENTITY / MSG_CLOSEDS该操作可以关闭指定的Source。 12关闭Source Manager(状态3到2)Triplets 操作: DG_CONTROL / DAT_PARENT/MSG_CLOSEDSM关闭打开的Source Manager。 七、TWAIN的数据传

39、输模式TWAIN定义了三种模式用于Source 到Application的数据传输:本地模式、文件模式,和缓存模式。现在对每种模式进行一个简单的介绍。注:对于音频数据的传输,只能选择本地模式或者文件模式来进行传输。 本地模式 所有的输入设备都支持这种本地数据传输模式,同时它也是TWAIN默认的数据传输模式,并且它还是最容易使用的数据传输模式。但是,它有一定的局限性,它传输的数据必须是DIB 图像数据,并且在传输时,会受到系统内存大小限制。 传输数据的格式:  DIB (Device-Independent Bitmap)使用该模式,在数据传输时

40、Source 分配一块单独的内存区域,并把图形数据写入这个内存区域内。然后它通过一个指向该内存地址的指针告诉Application,数据存放在什么地方。你的应 用程序通过访问该内存区域去获得具体的图像数据。注意,Application在获得数据后要负责去释放这部分的内存。如果你的图像数据大于系统当前可用 内存,会导致传输失败。 文件模式 该模式是让Application 创建一个文件,这个文件用于储存传输的数据,Source将对该文件进行读写操作。Source将把要传输的数据写到该文件中,你的应用程序通过访问该文件,就可以获得传输的数据。 在使用本地模式传输一个大

41、的图像文件时,如果内存不够大,可以考虑使用文件传输模式来传输。文件传输模式与缓存传输模式相比,在使用方法上要简单些,但是该模式在传输速度上比缓存模式的传输速度要慢一些,并且在数据传输完毕后,你的应用程序还必须去管理这个数据文件。 缓存模式  缓存模式在整个传输过程中,将使用一个或多个内存缓存区,内存缓存区的分配和释放工作由Application来控制。在传输过程中,传输数据被当作一个未知格式的位图。Application必须使用TW_IMAGEINFO 和 TW_IMAGEMEMXFER操作,去得到各个缓存区的信息并把它们正确组织为一个完整的位图。 如果

42、使用本地模式 或 文件模式 去传输数据,整个传输过程在只需要一个Triplets操作就可以完成。如果使用 缓存模式 传输数据, 你的应用程序可能需要使用多个Triplets操作,不停地去获得缓存区的数据信息。但是,该传输模式具有很好的灵活性, 可以很好的去控制获得的数据,只不过在编程应用上要麻烦一些。 八、TWAIN的应用实现好了,看了前面的对TWAIN的介绍,现在我们就动手开始进行实际的编程吧。在这里,只进行一个最简单的应用实现。我们的应用程序不去设置设备的性能参数,不选择其它数据传输模式,仅仅使用TWAIN的默认的本地传输模式方式,去获得图像数据。在进行实际编程应用前,我们可以先

43、安装TWAIN 提供的工具包。它不仅提供了TWAIN应用的例程,还可以在你的计算机系统上安装一个虚拟的图像输入设备(TWAIN_32 Sample Source )。这对于没有扫描仪、数码相机的开发者,提供了一个很好的测试设备。TWAIN工具包的下载地址: /devfiles/twainkit.exe 。由于TWAIN目前提供的是基于C的编程接口,所以我们这里采用VC作为开发工具。我们可以建一个自己的TWAIN类。把一些Triplets操作封装成这个类的成员函数。以便于程序调用。记住:在你的项目中要加入TWAIN提供的头文件。前面已经介绍了,在进行TWAI

44、N的操作前,如何加载TWAIN_32.dll文件,获得DSM_Entry()函数指针。下面仅简单介绍一下其他的成员函数。 1 打开Source Managerint CTwain:OpenSourceManager(void) TW_UINT16 rc;. . ./ lpDSM_Entry 是指向DSM_Entry的函数指针    rc = (*lpDSM_Entry) (&AppID, NULL,         &

45、#160;                DG_CONTROL,DAT_PARENT,MSG_OPENDSM,                           

46、60;     / hPWnd 是指定为Source的父窗口的句柄                        (TW_MEMREF) & (*hPWnd) ;      switch (rc)   

47、 / 检查打开Source Manager是否成功          case TWRC_SUCCESS:   /  成功         . . .     case TWRC_CANCEL:       &

48、#160; . . .         . . . 2打开Sourceint CTwain:OpenSource(void)    TW_UINT16 rc;    rc = (*lpDSM_Entry) (&AppID,NULL,             &#

49、160;          DG_CONTROL,DAT_IDENTITY,MSG_OPENDS,                       (TW_MEMREF) &SourceID);  / SourceID 是要求打开Source&#

50、160; switch (rc)    / 检查打开Source Manager是否成功        case TWRC_SUCCESS: /  成功     . . .          . . . 3处理Source的事件int CTwain:

51、DealSourceMsg(MSG *pMSG)    TW_UINT16  rc    = TWRC_NOTDSEVENT;    TW_EVENT  twEvent;    twEvent.pEvent = (TW_MEMREF) pMSG;    rc = (*lpDSM_Entry) (&AppID,&SourceID, &

52、#160;                     DG_CONTROL,DAT_EVENT,MSG_PROCESSEVENT,                      

53、; (TW_MEMREF) &twEvent);    switch (twEvent.TWMessage)        case MSG_XFERREADY:  / Source准备好传输数据了 iStatus=6        iStatus=6;       &#

54、160;GetBmpInfo();        DoNativeTransfer();    case MSG_CLOSEDSREQ: / 关闭 Source 用户界面的申请    case MSG_CLOSEDSOK:     case MSG_NULL:       . .

55、 . 4使用本地模式传输数据int CTwain:DoNativeTransfer(void)    TW_UINT32  hBitMap = NULL;  / 指向图像数据地址    TW_UINT16  rc;     HANDLE     hbm_acq = NULL;     rc

56、 = (*lpDSM_Entry)(&AppID,&SourceID,                        DG_IMAGE,DAT_IMAGENATIVEXFER,MSG_GET,                      

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论