虚拟打印相关

上传人:jiups****uk12 文档编号:37686339 上传时间:2018-04-20 格式:DOC 页数:31 大小:432KB
返回 下载 相关 举报
虚拟打印相关_第1页
第1页 / 共31页
虚拟打印相关_第2页
第2页 / 共31页
虚拟打印相关_第3页
第3页 / 共31页
虚拟打印相关_第4页
第4页 / 共31页
虚拟打印相关_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《虚拟打印相关》由会员分享,可在线阅读,更多相关《虚拟打印相关(31页珍藏版)》请在金锄头文库上搜索。

1、第一章第一章 打印机体系结构和虚拟打印机打印机体系结构和虚拟打印机1.Windows 打印体系结构windows xp 的打印体系结构是由打印假脱机和一系列打印驱动程序组成。应用程序通过设备无关的 Win32 打印和 GDI(图形设备接口)函数,创建打印作业并将其发送到不同的设备,如激光打印机、向量绘图仪、光栅打印机以及传真机。打印驱动程序包括一个允许用户控制可选属性的用户接口。整个的打印流程如下: 应用程序通过调用 GDI 创建打印作业,应用程序对 GDI的调用传递到 GDI 图形引擎,该引擎将绘制指令脱机处理为 EMF 文件(增强型图元文件)或者直接连接到打印机驱动程序上,然后将打印图像传

2、递到假脱机系统。此时应用程序完成了打印文档的任务,用户可以自由使用应用程序完成其他任务,而打印假脱机则保证文档被打印。打印假脱机将页面布局信息和作业控制指令加入数据流,然后将数据流发送到打印处理器,打印处理器检查打印假脱机文件的格式,对于 EMF 文件,它将内容的每一页回放给 GDI,GDI 把 GDI 命令分解成 DDI(图形设备接口)定义的绘制图元,并把绘制图元送到打印驱动程序,打印机驱动程序将绘制图元绘制成打印机语言格式的原始数据,例如 PCL 等,接着原始数据被送到打印假脱机系统。接着打印假脱机将数据发送到语言监视器,语言监视器把数据发送到端口监视器,端口监视器用 OS 文件系统 AP

3、I 往硬件端口写数据,最后数据被发送到打印机。假脱机和打印机组件式可以替换的,这使得硬件供应商可以很容易对新硬件进行支持。整个打印体系结构如图 1-1 所示:图 1-1 打印体系结构图在进行打印机驱动程序开发之前,首先需要明确的是:打印机驱动程序仅仅是 Windows 打印流程中的一个中间环节。一个打印机驱动程序是对一种特定打印机提供了一个图形函数集的动态链接库(DLL),它所提供的接口函数可以将与设备无关的输出信息转变为与设备相关的输出信息(指令和数据流)。为了能够充分理解打印机驱动程序在一个实际打印作业中的地位与功能,从而很好的完成其设计与开发,对 Windows 整个打印流程有一个系统的

4、分析是非常必要的。下面的流程图(图 1-2)给出的便是从一个应用程序发出打印请求开始,到本地的打印提供者将假脱机文件写到磁盘,然后该假脱机文件将在合适的时间被解析成具体的指令和数据,最后由本地端口监视器将解析过的数据流通过它所控制的端口发送到与之相连的打印机并最终完成打印的完整过程。图 1-2 windows 打印流程图下面步骤详细描述整个打印流程:1:应用程序创建一个设备上下文并在其上绘制一个对象,然后调用 GDI中相应的函数接口向与此设备上下文相对应的打印机发出一个打印请求。2:GDI 调用相应的打印机驱动程序来处理打印请求。3:打印驱动程序创建一个打印作业,并调用 GDI 函数将处理结果

5、返回 GDI。4:GDI 调用打印假脱机系统。5:打印假脱机调用打印请求处理器以便将打印作业发送到应用程序指定的打印机上。6:打印请求处理器将打印作业发送到本地打印提供者(目标打印机在本地)或者网络打印打印提供者(目标打印机在网络中)。7:如果打印作业的类型是非直接打印,那么本地打印提供者就将打印作业以原始假脱机文件的格式存放在磁盘上,并且将后来的打印片段不断的附加到假脱机文件中,直到应用程序调用了 EndDoc 函数终止一个打印作业为止。以上第一到第七步可能是重复多次来产生一个完整的假脱机文件。8:本地打印提供者启动一个后台线程,打印主线程根据对打印假脱机子系统资源的监视情况,选定一个最佳的

6、时刻触发假脱机文件的解析过程。此时,打印主线程将调用 StartDoc 函数启动打印处理器中的一个线程来开始解析工作。9:打印机处理器线程调用 ReadPrinter 调用来激活本地打印提供者以便从磁盘读取前面所生成的打印假脱机文件。10:打印处理器同时还调用了 WritePrinter 函数来激活打印机作业的语言监视器以便将数据通过物理端口发送到相应的打印机上。11:打印语言监视器调用打印端口监视器的功能来给打印机发送数据。12:打印端口监视器监测物理端口,通过物理端口给打印机发送数据。13:端口监视器调用内核端口驱动程序完成物理端口与打印机间的通信。14:完成打印作业后解析线程终止。1.虚

7、拟打印机虚拟打印机同真实打印机一样,安装完毕,打开“控制面板”中的“打印机和传真”,会看到所安装的虚拟打印机,可以像使用一台打印机一样使用它们。鼠标双击将其打开,可以对其“打印首选项”和“属性”进行修改,从而设定是否共享、可使用时间、是否后台打印和优先级,以及纸张大小、版式安排等。它们同样能截获所有 Windows 程序的打印操作,或模拟打印效果,或完成某一特殊功能。有些软件自带虚拟打印机,有些则是专门的虚拟打印机,利用这些虚拟打印机,可以帮助我们完成很多特殊的任务。虚拟打印机的打印文件是以某种特定的格式保存在电脑上。打印机是比较重要的输出设备,但有些时候,我们并不需要把东西真实地打印出来,而

8、只是想通过打印预览功能来看看输出的效果。但如果计算机中没有安装打印机,那么打印预览也不能实现,就不能够观看到打印的效果,这给我们这些没有打印机的朋友们带来了很多不便。但在实际应用中我们更经常的可能会遇到这样的问题:我们有打印机,但是我们所使用的软件只提供给我们“打印”的功能,我们在打印之前不能预览。如果我们不想浪费纸、墨,一次又一次试验调用效果,那么解决办法只有一个:安装一个虚拟打印机。简单地说,虚拟打印机就是在你的机器中添加一个虚拟的打印机让你可以使用它来打印。我说的这个虚拟打印机可不同于你以往添加的像 hp LaserJet 2000 那些只能用于打印预览的“虚拟打印机”:你可以用它来打印

9、文件,即使软件并不支持打印预览的功能!使用的方法就和你使用正常的打印机一样.当然,你不可能用虚拟打印机把文件直接打印到纸上(否则打印机卖给谁),用虚拟打印机打印的结果是硬盘上的一个文件,你可以用专门的阅读器打开那个文件以查看打印的效果。虚拟打印机实际上并不存在的,只是为了工作需要而安装的打印机。虚拟打印机有三种定制方法:1、驱动层(Driver)一种。修改 Render plug-in,对渲染绘制过程进行特殊的处理。2、打印假脱机(splooer)层两种。(1)自定义打印处理器(PrintProcessor),一般是修改 DDK 中genprint 的例子。将自定义的代码加入到 PrintDo

10、cumentOnPrintProcessor 中。(2)在监视(Monitor)层。作者采用的方法,在后面介绍中读者会看到。打印假脱机(splooer)层两种的两种实现方法驱动层一般都用微软统一驱动程序(UniDrv)。通过打印测试页可以了解安装的打印驱动的各个方面:驱动程序、端口等。也可以通过打印机的属性查看。作者就是在监视器层进行的。第二章第二章 准备工作准备工作 工欲善其事,必先利其器。同样在开发时也要选择合适的集成环境。作者在虚拟打印开发任务中先后用过多款开发工具。如何选择合适的集成环境,相信没有唯一的答案。每个人都有自己偏好和标准。在这里作者会介绍自己的开发工具。希望大家在以后的开发

11、中能得到启发和帮助。下面,作者一一介绍下工具。2.1 安装软件NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。在虚拟打印开发中,它创建安装包,它里面调用了windows 自带的功能安装 INF,完成虚拟打印机的安装任务。NSIS 软件下载地址如下: http:/ )2.2 集成开发工具以前很多

12、人一直都是用 VS2008 + DDKWizard + WinDbg 来进行驱动程序的开发调试的,使用 DDKWizard 来搭配调试环境,在 VS2008 下还算方便,因为不需要自己去设置一些什么包含文件和源代码路径之类的就可以直接编译驱动程序源码,安装好 DDKWizard 后在 VS2008 中就会自动出现一个开发驱动程序的项目框架,就跟选择创建 WinForm 应用程序一样的,创建好 DDK 项目后也是可以直接在 VS2008 下编译的,所以在开发上方便,但是在调试上的话,就麻烦了,在 WinDbg 中有一大堆东西要设置,在虚拟机上也要设置一些命令。但是在使用 DDKWizard +

13、VS2008 进行驱动开发时,是不能够直接通过VS2008 来调试的,而一般都是在 WinDbg 中设置好符号文件的路径以及源代码的路径,然后再驱动程序的源代码中嵌入一些汇编代码,当然这些汇编代码只是简单的用来实现一个中断,从而在 WinDbg 调试器中会生成一个断点。这样调试起来速度慢,也不好控制,所以有时候觉得在做开发的时候,在调试上花去的时间太多了,会不爽。在本项目中,将要介绍的是一个开源项目 VirtualDDK,通过这个开源项目即可以很好的实现在 VS2010 以及 VS2008 下直接调试驱动程序,同时对于VirtualDDK 的环境搭配也是很简单的,下面提供的链接直接上一些图片以

14、及一些注解来说明,由于文章存在大量的截图,所以读者只要按着截图来做基本上都可以成功的。VS2010 + VMware + DDK (安装参见:http:/ NT 的操作系统下,用户所看到的打印机视图其实是一个打印队列,一个或者多个物理打印机设备可以与该队列相连。端口就是打印队列和一个打印设备之间的物理连接。打印机驱动程序中端口监视器模块负责和端口相关的操作。每一个端口监视器支持一种或者多种端口类型的实例。当需要给打印机添加新类型的端口实例时,就需要提供新的端口监视器。打印假脱机通过调用AddPrinier函数来把一个端口指派到端口监视器中。在打印过程中,各种类型的打印设备都被列在打印队列中,打

15、印假脱机把打印作业发送到第一个可用的端口。如果端口监视器指示这个端口正忙或者发生错误,打印假脱机把打印作业重新提交到打印队列,并指定该端口监视器支持的另外一个端口发送打印数据。2.3.2 端口监视器构成一个端口监视器由一些用户模式下的动态链接库组成。它的职责有两方面,一是负责管理和配置服务器端的和打印机硬件连接的打印端口;二是为运行在用户模式下的打印假脱机和运行在内核模式下的可以直接访问 FO 硬件端口的端口驱动之间建立通信链接。对 Windows2000 和以后的操作系统而言,每一个端口监视器都被分为两个动态链接库:l:Port Monitor Ul DLL端口监视器的接口动态链接库包括功能性的用户接口。这个动态链接库存放在客户系统的 System32 文件夹中并且在打印机的客户端系统上执行。2:PortMonitorServerDLL端口监视器的服务动态链接库包括端口的通信功能并且在打印机的服务器端系统上执行。以上两个动态链接库之间通过打印假脱机的 XcvData 函数通信。需要说明的是:虽然端口监视器被分成了两个动态链接库,但是在具体编写端口监视器的过程中,却可以有两种

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号