V4 驱动程序设置概念

重要

建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) ,自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

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

v4 打印驱动程序模型使用新的设置模型来改善用户体验并减少支持成本。

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

设备标识符

CompatibleIDS

CompatibleID 是打印类驱动程序的关键概念,因为它们使驱动程序能够支持新版本 Windows 发布后发布的设备,而无需更新驱动程序。 这是可能的,因为 CompatibleID 使设备能够播发对比 HardwareID 更不具体的打印驱动程序的支持。

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

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

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

例如:

1284_CID_FA_PCL5e_Laser

如果兼容 ID 已在现有设备中实现,则打印驱动程序应继续使用这些 CompatibleID。

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

Microsoft 支持一些标准兼容ID,以支持多个与制造商无关 (标准) 打印类驱动程序。 下表显示了这些标准兼容 ID 及其关联的 PDL 文件类型。

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

这些标准打印类驱动程序仅支持一小部分功能,因此选择使用这些类驱动程序的制造商应实现增强的驱动程序配置,使用 Bidi 添加更具体的纸张大小和配置。 下表显示了标准打印类驱动程序支持的功能和关联选项。

功能 选项
纸张大小 字母,A4
解决方法 300dpi、600dpi
介质类型 普通纸
N 个向上 1, 2, 4, 6, 9, 16

PrinterDriverID

PrinterDriverID 是一个新标识符,用于确定打印机共享的驱动程序之间的兼容性,以及驱动程序与打印机扩展之间的兼容性。 例如,如果服务器上的驱动程序在其清单文件中指定 PrinterDriverID,然后共享该驱动程序,则连接到此打印机的客户端将搜索本地驱动程序存储并Windows 更新在其驱动程序 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 和被错误复制和粘贴的 GUID 容易发生冲突。

设置行为

对于 v3 驱动程序,打印队列名称首先由驱动程序名称决定,然后由用户决定。 随着打印类驱动程序的引入,驱动程序名称对用户识别设备的作用要小得多。 Windows 将自动重命名已安装用于运行 v4 打印驱动程序的任何即插即用设备的队列,如下所示:

  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 将搜索“制造商”或“林盟”和“模型”或“MDL”。

      1. 如果两者都指定了,Windows 会将它们串联为“制造商模型”。

      2. 如果其中只有一个失败,Windows 将使用另一个键的值作为队列名称。

添加打印机向导

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

更改端口和处理打印机开发节点

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

当两个不同的对象相关时,UI 会将开发节点分组到设备容器中。 此分组允许多功能打印机 (MFP) 在 “设备和打印机” 文件夹中显示为一个图标。 MFP 中所有函数的容器 ID 必须相同,才能使函数全部显示在同一图标下。 这会自动为 PnP 设备完成。

更改与队列关联的端口将更改与队列的开发节点关联的容器 ID。 这将导致队列不再与物理设备的其余 PnP 对象在同一设备容器下分组。 操作系统中没有足够的信息来正确清理队列和 PnP 对象分离的情况。 在某些情况下,这是用户的实际意图。 只有更改端口名称的用户或应用程序知道预期结果是什么,用户/应用程序应清理队列端口更改后留下的任何令人困惑的状态。 下面是两个示例情况,其中说明如何正确清理。

  1. IT 管理员设置打印机 – IT 管理员使用 WS 发现在网络上查找打印机,并将端口更改为 TCP/IP,因为他们喜欢 TCP/IP 管理过程。

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

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

  2. IHV 安装软件 – IHV 将安装驱动程序和自定义端口监视器, (v4 中不允许使用自定义端口监视器,但相同的开发节点处理适用于 v3 驱动程序) 。 IHV 将打印队列的 USB 端口更改为设备制造商创建的端口。

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

    2. 解决方案 1 – 仍然需要 PnP 开发节点:安装程序更改队列开发节点的容器 ID 以匹配 PnP 对象。

    3. 解决方案 2 - PnP 开发节点是无关的:安装程序删除原始 PnP 设备。

驱动程序排名

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

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

驱动程序设置最佳做法

打包

V4 打印驱动程序不使用 需求 ,并且 包括 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 行:“驱动程序名称”= INSTALL_SECTION,总线数字器\HardwareID

    2. PrinterDriverID 行:“驱动程序名称”= INSTALL_SECTION,{GUID}

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

    1. “驱动程序名称” = INSTALL_SECTION,WSDPRINT\HardwareID

    2. “驱动程序名称” = INSTALL_SECTION,USBPRINT\HardwareID

    3. “驱动程序名称” = INSTALL_SECTION,LPTENUM\HardwareID

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

    1. HardwareID 行:“驱动程序名称”= INSTALL_SECTION,HardwareID

    2. PrinterDriverID 行:“驱动程序名称”= INSTALL_SECTION,{GUID}

    3. CompatibleID 行:“打印类驱动程序名称”= INSTALL_SECTION,1284_CID_CompatID

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

如何在打印设备中实现兼容的 ID

Windows 如何对驱动程序进行排名

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