打印机驱动开发,初步了解

article/2025/10/12 23:40:29

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

打印机驱动一般分为两个部分。
1.printer graphics DLL
2.Printer Interface 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分别实现

Windows打印体系结构以打印池为中心,打印机图形dll的打印接口是打印驱动程序的一部分,打印的流程如下:

应用程序通知打印池开始一个新的打印任务;
打印池调用打印机接口DLL显示打印对话框,并将打印设置信息传给它;
应用程序调用GDI进行绘图操作
GDI将应用程序的绘图调用保存在EMF文件中,记录完毕将之发送给打印池;
GDI返回应用程序完成一次假脱机打印过程,可以进行其他任务;
打印池调用GDI,把EMF文的绘图命令一条条分解到打印机上下文中;
GDI通过系统调用,调用GDI引擎实现绘图操作;
GDI引擎将GDI绘图命令分解组合,在打印机图形DLL的帮助下,完成各种图形的绘制;
打印机图形DLL将绘图解码后的数据发往打印池;
打印池把打印机数据发往打印机。
                                        

 

                                                    图1Windows打印流程

实际上开发虚拟打印机过程就是设计第8步的GDI引擎中的图形绘制命令。

GDI引擎和图形设备之间的接口叫做 Device driver interface(DDI),DDI函数都有Drv前缀,共有89个,其中GDI引擎和打印机图形DLL之间的DDI函数可以分成3部分,即初始化函数,文档和页面控制函数以及图形绘制函数(表面钩子函数)开始打印前要对打印机进行初始化DrvEnableDriver是打印机图形dll的入口点,相当于一般dll的 dllMain,当GDI引擎加载打印机图形dll时要先调用这个函数,它负责分配资源和初始化内部变量。

Ecgprint中为OEMEnableDriver函数,在此函数中钩入钩子函数(如 OEMTextout, OEMStartDoc,OEMEndDoc等)DryEnablepdev是很重要的函数,它负责分配驱动程序定义的PDEV(物理设备)结构实例。

其中有两个结构非常重要:一个是 GDIINFO结构,这个结构设置设备分辨率、物理大小、颜色格式等信息;

另一个是 DEVINFO结构,描述驱动程序图形能力、缺省字体、设备字体数量和抖动格式等。

Ecgprint中为 OEMEnablepDev函数,在此函数中没有设置这两个结构,不知为什么?

DryEnablepdev成功返回后,即表示该打印机设备已初始化,随后GDI引擎

       调用 DrvCompletePDEV来给物理设备准备使用的信号。

在GDI引擎能够实际开始绘画之前,必须在 DrvEnableSurface中提供一个绘图表面。这个表面既可以是GDI引擎管理的位图表面(用 Eng CreateBitmap创建),即DIB,也可以用 EngCreateDeviceSurface创建设备管理的位图表面,即DDB。 Ecgprint中没有实现此函数。

当使用标准DIB时,驱动程序可以让GDI引擎完成所有的绘制工作而不必钩入任何函数;否则就要提供自己的实现,除了几个基本实现的基本钩子,其他的都可以交给GDI引擎处理。

                                            

 

                                                        图2打印机图形驱动初始化过程

 

  

为了完成文档打印,需要实现以下文档和页面空直接函数以及表面钩子函数

表1 需要实现的函数


 

 


http://chatgpt.dhexx.cn/article/8avE1g8Y.shtml

相关文章

测试驱动开发

测试驱动开发 概述 极限编程是一个轻量级的、灵巧的软件开发方法,同时它也是一个非常严 谨和周密的方法,它从 4 个基本方面对软件项目进行改善:交流、简易、反馈 和勇气。测试驱动开发则是极限编程的最佳实践之一。它是编程时使用的技术&am…

C++开发方向之windows驱动开发

1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C客户端工作岗位,猎头也问我是否有了解windows内核。 所以,调研了一下C的开发方向:windows驱动开发。 先来看看招聘网上&#xff…

Linux驱动开发|UART驱动

UART驱动 串口是一个常用的外设,在 Linux 下通常通过串口和其他设备或传感器进行通信,根据电平的不同,串口分为 TTL 和 RS232。虽然接口电平不同,但其驱动程序都是一样的,通过外接 RS485芯片就可以将串口转换为 RS485…

Linux驱动开发|WiFi驱动

WiFi驱动 一、WiFi驱动添加与编译 I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI:USB 和 SDIO,其中 USB WIFI 使用的芯片为 RTL8188EUS 或 RTL8188CUS, SDIO 接口的 WIFI 使用的芯片为 RTL8189FS。这两个都是 realtek 公司出品的 WIFI 芯片。…

驱动开发:配置Visual Studio驱动开发环境

在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.exe安装包,Visual Studio的安装非常的简单,您…

DDD领域驱动开发

文章目录 DDD(Domain Driving Design)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务 2、领…

Linux驱动开发|USB驱动

USB驱动 USB接口很复杂,不同的设备器协议也不同,因此本文仅介绍如何使能Linux内核自带的USB驱动,不涉及USB驱动开发 一、USB接口简介 1.1 USB介绍 USB(Universal Serial Bus),即通用串行总线。由英特尔…

window10+vs2022配置window驱动开发环境

测试模式 开发的驱动程序没有官方数字签名,只能在测试模式下加载。 命令行键入以下命令,重启电脑后桌面右下角出现测试模式字样,说明进入了测试模式 bcdedit /set testsigning on 命令行键入以下命令,重启电脑后桌面右下角没有了测…

win10驱动开发——驱动签名

win1803开始直接禁用驱动强制签名的方式不行了 1.设置环境 bcdedit -set NOINTEGRITYCHECKS ON bcdedit -set TESTSIGNING ON bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS2.配置环境变量 找到makecert.exe文件位置如【C:\Program Files (x86)\Windows Kits\10\bin\1…

Windows 10 驱动开发 及 驱动签名

记录下在公司开发驱动的一些注意事项, 驱动当前仅针对win10x64. 常识: 最早的驱动开发sdk是 ntddk, 类似于用户层的win32 api, 后面为了增加对pnp(Plug-and-Play, 即插即用)的支持, 迭代为 wdm. 后面因为wdm开发过于繁琐, 微软发布了 WDF 框架, 类似于 用户层的 …

Linux——驱动开发

一、驱动开发概述 1.1 驱动形式 驱动代码的形式一般可分为build-in和module两种形式,build-in是在编译linux同时将pcie的驱动代码编译到内核中,启动的时候就载入该驱动代码;module是在linux启动完成后通过终端输入命令insmod/remod进行载入…

Windows 驱动开发 新手入门(一)

Windows 驱动开发 新手入门(一) 引言驱动介绍Win10 WDK 建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP 引言 首先祝朋友们新年快乐,然后呢,因为无聊&#xff…

驱动开发学习

驱动 1、驱动开发环境 完成系统移植的三步:u-boot启动引导程序、内核镜像、文件系统,u-boot启动引导程序最好固化到开发板上,内核镜像通过tftp服务从ubuntu下载,文件系统通过nfs服务从ubuntu共享到开发板,开发板启动…

Linux设备驱动开发详解

Linux设备驱动开发详解 Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核及内核编程4. linux内核模块5. linux文件系统与设备文件6. 字符设备驱动7. linux设备驱动中的并发控制8. linux设备驱…

QT部件基类——QWidget与QDialog

一、默认基类 QT提供的默认部件基类包括QMainWindow、QWidget、和QDialog这三种,这三个部件基类也是用的最多的。 QWidget类是所有部件对象的基类,被称为基础窗口部件,继承关系详看QWidget类关系图。QWidget提供自我绘制和处理用户输入等基本…

qt 中 qwidget 嵌入 qml

以上是效果图&#xff0c; 整个窗口是 qml 窗口 核心代码 #ifndef WIDGETANCHOR_H #define WIDGETANCHOR_H#include <QObject> #include <QQuickItem> #include <QWidget> #include <QQmlApplicationEngine> #include <QQmlContext>class WgtAn…

QWidget尺寸限定

1、控件只能在最小和最大之间进行调整&#xff0c;不能超过范围。 ①直接宽高同时设置 window.setMinimumSize(200, 200)&#xff1b; window.setMaximumSize(500, 500) app QApplication(sys.argv)window QWidget()window.setWindowTitle("最小最大窗口")windo…

QWidget居中显示

须知 以下函数只要继承QWidget都可以使用.例如 QDialog, QPushButton( -v- 一个居中的”引爆按钮”)关于坐标问题: qt窗口坐标原点是在”左上角”的. 如图, (x2, y2)是我窗口的分辨率的一半无论目前我的窗口在什么位置,我只要把窗口原点设置为(x1, y1)就行了.所以目前我要获得…

QWidget事件消息

1、用户操作界面时会产生特定的事件消息。 API&#xff1a;显示和关闭事件、移动事件、调整大小、鼠标事件、键盘事件、焦点事件、拖拽事件、绘制事件、改变事件、右键菜单、输入法。 应用场景&#xff1a;当一个控件被触发了一个特定的行为时&#xff0c;就会调用特定的方法…

QWidget的isHidden和isVisible

文章目录 问题的出现QWidget的show()函数QWidget的isVisible和isHidden源码追溯 QWidget的isHidden和isVisible 问题的出现 最近在写代码的时候&#xff0c;出现了一个问题&#xff0c;我新建了两个类&#xff0c;分别是Chapter2和ConsecutiveCurtain // ConsecutiveCurta…