ImagePrinter是在Port监视器端的虚拟打印机。

(1)在系统开机时,顺序调用以下函数:DllMain--->InitializePrintMonitor--->iEnumPorts(2次,后一次参数都是NULL)--->iOpenPort;

(2)在打印文档时,顺序调用以下函数:iStartDocPort--->iWritePort(很多次)--->iEndDocPort。

以下是DDK的翻译(根据对代码的理解,有删减):

(1)初始化打印监视器
   当spooler调用LoadLibrary来加载的打印监视器DLL,系统立即调用DLL的DllEntryPoint函数。可以在此时LisableThreadLibraryCalls,这样创建和删除线程时,不必非得这个通知DLL。

每一个DLL都导出一个初始化函数,可以供spooler在调用LoadLibrary后调用。Language monitor DLL和port monitor server DLL导出InitializePrintMonitor2函数。port monitor UI DLL的导出InitializePrintMonitorUI函数。(总共有3中Monitor)。

这两个初始化函数的作用是返回其他函数(EnumPorts,OpenPort,StartDocPort等所有以下用的函数)的指针,这样spooler就可以调用它们了。初始化函数也可以执行load time的初始化操作。

InitializePrintMonitor2函数返回一个监视器实例句柄。monitor应分配本地内存来存储自定义的一些信息,并以此句柄为标识来分配内存。

当spooler第一次启动时(一般是开机时,如果你开机启动了spooler服务的话),它会载入所有已安装的monitor DLL的。所有Monitor的初始化函数调用后,打印后台处理程序调用每个port monitor的EnumPorts函数,其中列举了monitor支持的端口。monitor支持一个端口,如果端口已被添加到monitor的数据库。然后打开每个支持的端口。

(2)打开和关闭端口
   spooler 通过调用language monitor的OpenPortEx函数打开端口;相对应的Port monitor调用OpenPort函数,language monitor只返回从Port monitor的OpenPort获得的句柄。如果没有language monitor,就直接调Port monitor的OpenPort函数。打开一个端口后不关闭的话,不能再打开。

端口一经打开,打印后台处理程序就可以调用其他函数来打印作业了。这些函数使用OpenPort返回的句柄作为输入。什么时候端口关闭呢:系统关机,没打印任务....

(3)打印打印作业
  每个打印作业以StartDocPort开始,以EndDocPort结束。当print processor 调用的spooler的StartDocPrinter EndDocPrinter的函数时,这两个函数被调用。在这两个函数调用中间,不定量的WritePort, ReadPort, and GetPrinterDataFromPort函数被调用。

这些函数都需要用到OpenPortEx(或OpenPort)返回的句柄( port handle)作为输入参数。

当spooler调用language monitor 的WritePort函数,以将数据流发送到端口时,这些函数一般只增加一些特定的语言信息到接收到的数据流上,如PJL命令然后将它传递给相关的port monitor的WritePort功能。

ReadPort函数是用于获取双向打印机硬件的状态信息。Language monitor 通过调用SetPort将信息发送到spooler,获得状态信息。spooler不能调用ReadPort的函数。

如果打印硬件是双向的,language monitor和port monitor 都应该实现GetPrinterDataFromPort函数。language monitor的GetPrinterDataFromPort函数以注册表值的名称为输入,获得该名称的值(通常由调用相关的端口监视器的WritePort和ReadPort功能),并返回值给调用者。port monitor 的GetPrinterDataFromPort函数应该接受一个I​​ / O控制代码作为输入,调用DeviceIoControl返回控制代码给port driver,并返回结果。

虚拟打印机驱动开发——ImagePrinter(一)相关推荐

  1. USB虚拟总线驱动开发扩展之(利用虚拟USB总线驱动实现U盘模拟)

    by fanxiushu 2020-03-25 转载或引用请注明原始作者. USB虚拟总线驱动的使用范围是非常广泛的,可以使用它来模拟各种通用的USB设备. 以前的文章阐述过基于windows平台和基 ...

  2. 虚拟串口驱动 开发_服务虚拟化如何与测试驱动的开发相关

    虚拟串口驱动 开发 敏捷的软件开发方法依赖于服务虚拟化,以赋予每个IT团队自治权. 这种方法消除了障碍,使自治团队可以继续开发活动,而不必等待任何人. 这样,团队就可以开始迭代/冲刺,从而开始集成测试 ...

  3. Windows打印机驱动开发

    本文地址:http://www.tongxinmao.com/Article/Detail/id/317 开发打印机驱动程序通常有两种途径:一是开发一个完整的驱动程序,二是利用微软提供的通用打印机驱动 ...

  4. Windows打印机驱动开发笔记(一)

    在Windows中,打印机驱动的作用是编写一组接口.应用程序调用的GDI函数会变成相应的DDI函数,打印机驱动提供的这组接口负责将DDI函数转变为打印机识别的的指令.至于是通过网口.串口等接口与真实打 ...

  5. 佳博80系列打印机驱动开发DLL支持C#的过程

    最近小编的公司需要使用到佳博的打印机进行一系列的打印开发以及智能驱动,所以小编联系了佳博的官方客服,然后找到的他们的官方SDK开发包,进行开发,由于小编使用的是.net平台的C#语言,而官方的开发包里 ...

  6. Windows打印机驱动开发笔记(二)

    这部分介绍如何编写Rendering Plug-Ins. 这个plug-in是一个COM组件,需要向系统提供一个IPrintOemUni2接口的COM组件. 其中比较重要的函数是: 1.EnableD ...

  7. 虚拟打印机开发日志(一):使用x64 WIN7编译环境编译的完整步骤

    使用MS提供的MSPLOT驱动源文件,可方便地进行自用的打印机驱动开发或虚拟打印机驱动的开发,以下是一个最简的完整的使用DDK编译MSPLOT打印驱动的步骤: 1.编译对应的工具(64bit驱动) 打 ...

  8. Win10 添加虚拟打印机

    有时候做测试,需要用到打印机,但是你家里,或者局域网里,可能没有任何打印机.这时候就可以自己添加一些虚拟打印机了 首先打开 "控制面板" --> 设备和打印机 选择 &quo ...

  9. 开源虚拟打印机ImagePrinter

    开源虚拟打印机ImagePrinter的下载地址:http://code-industry.net/downloads.php 找那个free的,有源码下载. 要像看懂代码需要知道打印机的工作流程. ...

最新文章

  1. 静态方法与非静态方法的区别_程序员必看之ThinkPHP5中model与Db的区别
  2. 安卓高手之路之ClassLoader(总结篇)
  3. setings.py配置文件详解
  4. IDEA新建maven项目漏掉webapp目录解决方法
  5. Wireshark数据分析IP
  6. 3-17Pytorch与线性代数运算
  7. Sharding-Proxy安装_以及_sharding-proxy自动分表配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记019
  8. 用Docker快速搭建一个博客网站,很简单的嘛~
  9. 程序员如何掌握计算机英语
  10. math.js api static function
  11. 点击扫一扫二维码返回文本内容
  12. 在Ubuntu5.1中安装NVIDIA TNT2 M64老式显卡驱动程序..
  13. 【干货】实例讲解:跨部门沟通和与领导沟通的心得与技巧
  14. 马尔可夫链的常返态和非常返态-零常返态
  15. 【Proteus仿真】按键设置+数码管显示
  16. flag{e2f34a3a-9972-4ba5-bdeb-ff7d524d87cb} preg_match implode
  17. jquery ajax content type,JQuery ajax的contentType
  18. 清除 WindowsOffice KMS激活
  19. c语言编程学多久,丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会...
  20. mysql当前读与快照读

热门文章

  1. 安卓手机电脑投屏软件【apowermirror、虫洞投屏软件】
  2. Java面向对象05:创建对象的内存分析成员变量和局部变量的内存分析
  3. 免费云服务器+免费虚拟主机推荐
  4. Octane帮助文档中英双语版免费下载、oc用户手册、oc帮助手册
  5. Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n
  6. 利用python进行数据处理
  7. 精美卡通儿童教育班会课件PPT模板
  8. 【泛函分析】巴拿赫空间
  9. 高斯-赛德尔迭代算法(C++实现)
  10. Win7 + VirtualBox 安装 MacOS X 10.9 Mavericks 操作步骤