Windows打印机驱动开发入门

打印机驱动的作用

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

打印机驱动一般分为两个部分。

  1. Printer Interface DLL
  2. Printer graphics DLL

printer graphics DLL和Printer Interface DLL都已经编号,并留有plugin的接口。程序员可以编写相应的plugin。

由于Microsoft提供了Universal Printer Driver,所以编写驱动变得比较简单。

增强Universal Printer Driver可以分为三个部分:

  1. 增加一个叫做GPD的文件,这个文本定义了一些参数,Universal Printer Driver会读取这个文件,这个文件又被称作是Mini Driver。
  2. printer graphics DLL相关的plugin被称为Rendering Plug-Ins。
  3. Printer Interface DLL相关的plugin被称为User Interface Plug-Ins。

打印机驱动需要完成如下接口:

  • DevQueryPrintEx
  • DrvConvertDevMode
  • 。。。
  • DrvUpgradePrinter

这几个函数在Universal Printer Driver中分别在UNIDRVUI.DLL和UNIDRV.DLL分别实现。

如何编写Rendering Plug-Ins。

如何做一个打印机的驱动,将发到打印机的内容输出到一个图像文件中?

就象Acrobat 的打印驱动一样,当用户调用打印时,将内容输出到一个图像文件中。

第一种实现方法:

利用rendering plug-ins hook FilterGraphics函数,可得到每一线点阵数据。
微软2000ddk有现成的例子,在src\\print\\oemdll\\oemuni下,编译好即可以使用这个动态库oemuni.dll。

至于FilterGraphics函数里面怎样编程就看自己的了,反正每一线数据送出都会hook到buffer。如果你继续向spooler送,不要忘了用DrvWriteSpoolBuf函数。

提示:安装后OEMUNI.DLL在system32\\spool\\drivers\\win32x86\\3下

另一种实现方法 :

自己做一个port monitor,可在StartDocPort,writeport,readport,EndDocPort等函数中做处理。
但是buffer里的数据是从spooler来的数据命令混合流。

你需要根据自己的格式处理数据,从中分离命令和数据,关于port monitor也有例子,自己看。

此条目发表在 windows驱动开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论