V4 驱动程序安装的概念

重要

新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅新式打印平台打印支持应用设计指南

v4 打印驱动程序模型采用了新的安装模型,以改善用户体验并降低支持成本。

v4 打印驱动程序直接从驱动程序存储区运行,这消除了文件发生冲突可能性,并提高了安装性能。 v4 安装模型继续使用 INF 文件,但也采用了新的清单文件来获取打印机特定安装指令。

设备标识符

CompatibleIDS

CompatibleID 是打印类驱动程序的一个关键概念,因为它能使驱动程序支持新版 Windows 发布后的设备,而无需更新驱动程序。 之所以能做到这一点,是因为 CompatibleID 与 HardwareID 相比,能使设备播发对不太特定的打印驱动程序的支持。

如果打印类驱动程序已经支持某个特定的 CompatibleID,则 v4 打印驱动程序不应再指定它。 如果打印驱动程序的日期比打印类驱动程序的日期更新,则会自动从 Windows Update 网站下载打印驱动程序。

设备应在其 1284ID 字符串中包含 CompatibleID。 如果现有打印类驱动程序支持该设备,则打印驱动程序应使用该 CompatibleID,否则建议使用以下格式。

1284_CID_<manufacturer identifier>_<PDL identifier>_device family identifier

例如:

1284_CID_FA_PCL5e_Laser

如果现有设备已经实现了 CompatibleID,则打印驱动程序应继续使用这些 CompatibleID。

在安装基于 TCP/IP 的打印设备时,不使用 CompatibleID。 因此,用户需要仅使用驱动程序的名称来标识相应的驱动程序。 对于打印类驱动程序,建议制造商在其网站上提供打印类驱动程序支持的任何设备的兼容性列表。 有关如何在硬件中实施 CompatibleID 的详细信息,包括完整的规则和限制列表,请参阅如何在打印设备中实现 Compatible ID

Microsoft 支持几种标准的 CompatibleID,以便支持几种制造商通用的(标准)打印类驱动程序。 下表列出了这些标准 CompatibleID 及其相关的 PDL 文件类型。

PDL 文件类型 标准 CompatibleID
XPS 1284_CID_MS_XPS
OpenXPS (ECMA-388) 1284_CID_MS_OXPS
PCL6 1284_CID_MS_PCL6
PS 1284_CID_MS_PS

这些标准打印类驱动程序只支持一小部分功能,因此选择使用这些类驱动程序的制造商应使用 Bidi 来添加更多特定纸张尺寸和配置,从而实现增强型驱动程序配置。 下表列出了标准打印类驱动程序支持的功能和相关选项。

功能 选项
纸张大小 Letter, A4
解决方法 300dpi、600dpi
介质类型 普通纸张
N-Up 1、2、4、6、9、16

PrinterDriverID

PrinterDriverID 是一个新标识符,用于确定打印机共享驱动程序之间的兼容性,以及驱动程序和打印机扩展之间的兼容性。 例如,如果服务器上的驱动程序在其清单文件中指定了一个 PrinterDriverID,并且共享了该驱动程序,那么连接到该打印机的客户端将在本地驱动程序商店和 Windows Update 中搜索在其驱动程序 INF 中指定了相同 PrinterDriverID 的驱动程序。 如果找到匹配项,则会使用该驱动程序进行连接。 客户端计算机不会使用驱动程序名称来筛选匹配结果。

必须通过以下方式为所有兼容驱动程序指定 PrinterDriverID:

  • 在 v4 清单中使用 PrinterDriverID 指令。

  • 作为 v4 驱动程序 INF 中的 HardwareID。

两个不同的驱动程序要共享相同的 PrinterDriverID,它们必须兼容才能共享。 要使连接始终成功,两个驱动程序必须能够执行以下操作:

  • 支持相同的 PDL

  • 使用相同类型的配置文件(GPD 或 PPD)

  • 能够呈现服务器驱动程序的 GPD、PPD 和/或约束 JS 文件中指定的任何功能或选项

  • 支持相同的打印机扩展

后台处理程序不会验证这些限制,而是完全依赖 PrinterDriverID 来指示两个驱动程序是否兼容共享。 如果对上述任何项目进行更改,则制造商必须确保更改驱动程序的 PrinterDriverID。

打印机扩展还可以通过 PrinterDriverID 与驱动程序关联。 因此,共享一个 PrinterDriverID 的两个驱动程序必须使用相同的打印机扩展。 最后安装的打印机扩展将覆盖所有使用目标 PrinterDriverID 设备的先前打印机扩展,因此它们必须在同一应用程序中正常工作。

使用 GUID 的最佳做法

GUID 在 v4 打印驱动程序模型中被广泛使用,特别是在 PrinterDriverID、PrinterExtensionID、EventID 和 ModelID 中。 这些要么被用于唯一标识系统中的不同项目,要么用于标识相同项目,以便进行维修、共享等。

在创建新的 GUID 时,请务必使用 GUID 生成器,如 Microsoft Visual Studio 中包含的生成器或 SDK 中包含的生成器。 手动制作的 GUID 和错误复制粘贴的 GUID 容易发生冲突。

安装行为

对于 v3 驱动程序,打印队列名称首先由驱动程序名称决定,然后由用户决定。 随着打印类驱动程序的引入,驱动程序名称对用户识别设备的作用大大降低。 对于已安装运行 v4 打印驱动程序的即插即用设备,Windows 将自动重命名队列,具体如下:

  1. 最初,打印队列名称会被设置为驱动程序名称。

  2. 如果驱动程序是 v4 打印驱动程序,则 Windows 将使用 Bidi 来查询设备。

    1. 如果指定了 \Printer.DeviceInfo:FriendlyName,则它将被用作新队列名称。

    2. 否则,Windows 将查询 \Printer.DeviceInfo:Manufacturer、\Printer.DeviceInfo:ModelName。

      1. 如果同时指定了这两个名称,Windows 将把它们连接成“Manufacturer ModelName”。

      2. 如果只有一个 Bidi 查询失败,则 Windows 将使用另一个查询的成功返回值作为队列名称。

  3. 如果所有 Bidi 查询都失败,Windows 将使用 IEEE 1284ID 来确定制造商和模型名称。

    1. 如果指定了 DESCRIPTION 或 DES,则它将被用作新的队列名称。

    2. 否则,Windows 将搜索 MANUFACTURER 或 MFG 以及 MODEL 或 MDL。

      1. 如果同时指定了这两个名称,Windows 将把它们连接成“MANUFACTURER MODEL”。

      2. 如果其中一个查询失效,则 Windows 将使用另一个键的值作为队列名称。

添加打印机向导

驱动程序名称仍将是用户在“添加打印机向导”中选择驱动程序时可用的唯一标识符。 基于 TCP/IP 的设备应实现端口监视器 MIB (PWG 5107.1-2005) 以支持 TCP/IP 自动检测。 使用硬件 ID (HWID) 映射添加到打印类驱动程序的现有设备还可以使用特定于设备的模型名称。

更改端口和处理打印机 devnode

为了提供一致的 UI 体验,所有打印队列都有一个软件设备节点 (devnode)。 这就是在 UI 中发现打印机的方式,它允许以与即插即用 (PnP) 打印机相同的方式枚举和访问虚拟打印机、共享打印机连接和网络打印机。 物理 PnP 打印机的软件 devnode 将继承触发队列创建的 PnP devnode 的属性。

当两个不同对象相关时,UI 会将 devnode 分组到设备容器中。 这种分组方式可使多功能打印机 (MFP) 在设备和打印机文件夹中显示为一个图标。 MFP 中所有函数的容器 ID 必须相同,这样所有函数才能显示在同一个图标下。 PnP 设备会自动执行此操作。

更改与队列相关的端口会更改与队列 devnode 相关的容器 ID。 这将导致队列不再与物理设备的其他 PnP 对象分组到同一设备容器。 操作系统中没有足够的信息来正确清理队列和 PnP 对象分离的情况。 在某些情况下,这正是用户的真实意图。 只有更改端口名称的用户或应用程序才知道预期的结果是什么,用户/应用程序应自行清理队列端口更改后留下的任何混乱状态。 以下是两个示例情况,并附有如何适当清理的说明。

  1. IT 管理员设置打印机 - IT 管理员使用 WS Discovery 来查找网络上的打印机,并将端口更改为 TCP/IP,因为他们喜欢使用自己的 TCP/IP 管理程序。

    1. 预期 - 设备和打印机文件夹中只有一个“设备”。

    2. 解决方案 - IT 管理员从设备和打印机文件夹中删除 WSD PnP devnode。

  2. IHV 安装软件 - IHV 安装驱动程序和自定义端口监控器(v4 中不允许自定义端口监控器,但对 v3 驱动程序的处理方式与 devnode 相同)。 IHV 会将打印队列的 USB 端口更改为设备制造商创建的端口。

    1. 预期 - 设备和打印机文件夹中只有一个“设备”。

    2. 解决方案 1 - 仍然需要 PnP devnode:安装程序会更改队列 devnode 的容器 ID,以匹配 PnP 对象。

    3. 解决方案 2 - PnP devnode 无关紧要:安装程序会删除原始 PnP 设备。

驱动程序排名

引入 v4 打印驱动程序不会修改即插即用排名行为。 在插入设备后,将选择分数最高的可用驱动程序。 如果所选驱动程序是打印类驱动程序,而 Windows Update 网站上有排名更靠前的匹配驱动程序,则所选驱动程序将在用户下次下载 Windows 更新时被自动替换。

有关驱动程序排名的详细信息,请参阅 Windows 如何为驱动程序排名

驱动程序安装最佳做法

打包

V4 打印驱动程序不使用 needsincludes INF 文件指令或核心驱动程序技术来处理共享文件。 因此,v4 打印驱动程序必须是独立的,但也有少数例外。

V4 打印驱动程序可能会继续依赖 Windows 提供的常用文件。 其中包括 NTPrint.INF 或 NTPrint4.INF 中的文件。 驱动程序可通过在 v4 清单文件中指定 RequiredFiles 指令来包含这些文件。

如果现有的打印类驱动程序可为设备或 PDL 提供基本的呈现功能,那么还存在一种机制,可通过使用 RequiredClass 指令来依赖于类驱动程序。 此指令将让 Windows 使用 v4 打印驱动程序和所需打印类驱动程序的文件来创建一个驱动程序。 GPD 和 PPD 文件会被合并,最具体的文件优先于不太具体的文件。 下图展示了用于合并 GPD/PPD 文件的逻辑,还包括从 Bidi 获取的增强驱动程序配置文件。 其他驱动程序文件(如 JavaScript 约束)不会被合并到驱动程序包中。

gpd/ppd 文件合并逻辑。

打印机模型行

即插即用系统会对模型行上的所有 HardwareID 和 CompatibleID 进行隐式排名。 因此,Microsoft 建议合作伙伴应采用以下最佳做法,以避免在排名方面出现不可预测的行为。

V4 打印驱动程序

  1. V4 打印驱动程序 INF 必须定义两种不同类型的模型行:

    1. HardwareID lines: "Driver name" = INSTALL_SECTION, busenumerator\HardwareID

    2. PrinterDriverID lines: "Driver name" = INSTALL_SECTION,{GUID}

  2. V4 打印驱动程序 INF 必须在单个行上定义特定于总线的硬件 ID:

    1. "Driver name" = INSTALL_SECTION,WSDPRINT\HardwareID

    2. "Driver name" = INSTALL_SECTION,USBPRINT\HardwareID

    3. "Driver name" = INSTALL_SECTION,LPTENUM\HardwareID

  1. 打印类驱动程序 INF 必须定义三种不同类型的模型行:

    1. HardwareID lines: "Driver name" = INSTALL_SECTION,HardwareID

    2. PrinterDriverID lines: "Driver name" = INSTALL_SECTION,{GUID}

    3. CompatibleID lines: "Print Class Driver name" = INSTALL_SECTION,,1284_CID_CompatID

  2. 打印类驱动程序 INF 不得定义任何总线枚举器(例如 WSDPRINT)

如何在打印设备中实现 Compatible ID

Windows 如何对驱动程序分级

端口监视器 MIB (PWG 5107.1-2005)