打印驱动程序版本控制
重要
新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。
有关详细信息,请参阅新式打印平台和打印支持应用设计指南。
在 Microsoft Windows XP 及更高版本上,基于 Unidrv 和基于 Pscript5 的打印机微型驱动程序以及单片打印机驱动程序(完全由 IHV 开发的驱动程序)应使用打印机驱动程序版本控制。 Windows XP 和更高版本的打印后台处理程序使用版本控制信息,以便在安装新的操作系统版本或 Service Pack 期间,或者建立新的指向和打印连接时,选择正确的驱动程序文件。
Windows 2000 或以前的基于 NT 的操作系统版本不支持打印机驱动程序版本控制。 在这些操作系统版本中,打印后台处理程序根据是否仅在文件的时间戳上替换特定驱动程序文件来做出决定。 相比较旧的文件,始终优先选择较新的文件,即使具有较新日期的文件可能具有旧功能集也是如此。 由于更改文件的日期非常简单,因此这可以防止后台处理程序在所选文件中做出正确的选择。
要确保安装了正确的驱动程序文件版本,只需将版本号添加到这些文件。 为此,可以对 pdrvver.h(Windows 驱动程序工具包附带)进行轻微修改,并将该文件包含在打印机驱动程序 DLL 资源文件中。 使用基于 INF 的安装设置单片驱动程序也受益于驱动程序版本控制,因为较新的 DLL 不会被较旧的 DLL 覆盖,即使较旧的 DLL 可能具有较新的时间戳也是如此。
pdrvver.h 标头几乎完全由预处理器 #define 指令组成。 前两个指令 VER_FILETYPE 和 VER_FILESUBTYPE 不能修改,指示该文件是驱动程序的资源文件,特别是打印机驱动程序。 VS_FIXEDFILEINFO 结构中介绍了 VFT_DRV 常量和 VFT2_DRV_VERSIONED_PRINTER 常量,这两个常量与 VER_FILETYPE和VER_FILESUBTYPE 一起出现。 需要更改最后四项,如下所示:
VER_FILEVERSION
应将此常量设置为四个逗号分隔的 WORD 值序列。 第三个和第四个 WORD 分别用于设置 VS_FIXEDFILEINFO 结构的 dwFileVersionLS 成员的高和低 WORD。
下面介绍了四个 WORD 中每一个的含义。
第一个 WORD
保留。 此值应设置为 0。
第二个 WORD
表示驱动程序的主要版本。 对于用户模式驱动程序,请将此项设置为 0x0003。 对于内核模式驱动程序,请将此项设置为 0x0002。
第三个 WORD
表示具有高字节和低字节的功能集编号。
高字节
表示主要功能集版本。 假定较新版本具有上一版本的功能超集。 针对每个新主要版本递增此值。
对于在 Windows XP 及更高版本(包括 Windows 更新和 Service Pack)上运行的基于 Unidrv 和 Pscript5 的微型驱动程序,应将其设置为 0x05。
低字节
表示次要功能集版本 - 同一代码库或体系结构中的新版本。 针对每个新次要版本递增此值。
对于在以下操作系统版本上运行的基于 Unidrv 和 Pscript5 的微型驱动程序,应按如下所示方式设置此字节:
Windows XP:设置为 0x01。
第一个 Windows XP Service Pack:设置为 0x01。 (特定 bug 修复编号出现在第四个 WORD 中。
第一个 Windows 更新:设置为 0x02。
第四个 WORD
表示 bug 修复或 Service Pack 版本。 当它是 bug 修复或 Service Pack 的集合时,在发布新二进制文件时递增此值。
下面是一个单片驱动程序示例:
#define VER_FILEVERSION 0, 3, 0X0100, 0X0002
按从左到右的顺序,第一个 WORD 值为零,它也必须是零。 第二个 WORD 的值为 3,表示这是用户模式驱动程序。 在第三个 WORD 中,高字节的值 (0X01) 表示这是第一个主要版本,同一 WORD (0x00) 的低字节表示到目前为止没有次要版本。 第四个 WORD (0x0002) 表示这是第二个 bug 修复或 Service Pack 版本。 (这些类型的版本之间没有区别。)
下面是一些基于 Unidrv/Pscript5 的微型驱动程序示例:
#define VER_FILEVERSION 0, 3, 0X0501, 0X0001
如前所述,按照从左到右的顺序,第一个 WORD 值为零。 第二个 WORD 的值为 3,表示这是用户模式驱动程序。 在第三个 WORD 中,高字节值和低字节值(分别为 0X05 和 0x01)表示这是 Windows XP 的一个版本。 第四个 WORD (0x0001) 表示这是第一个 bug 修复或 Service Pack 版本。
#define VER_FILEVERSION 0, 3, 0X0502, 0X0000
与之前一样,第一个 WORD 为零,第二个 WORD 表示这是用户模式微型驱动程序。 第三个 WORD (0x0502) 表示这是 Windows XP 之后发布的第一个Windows 更新版本。 第四个 WORD (0x0000) 表示这既不是 bug 修复,也不是 Service Pack 版本。
VER_FILEDESCRIPTION_STR
应将此常量设置为标识驱动程序的名称,如以下示例所示。
#define VER_FILEDESCRIPTION_STR "Sample Printer Driver Resource DLL"
VER_INTERNALNAME_STR
将此常量设置为指定文件的内部名称(不包括路径)的名称,如以下示例所示。
#define VER_INTERNALNAME_STR "SAMPLERES.DLL"
VER_ORIGINALFILENAME_STR
将此常量设置为指定文件的原始名称(不包括路径)的名称,如以下示例所示。
#define VER_ORIGINALFILENAME_STR "SAMPLERES.DLL"