将表单添加到表单数据库

重要

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

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

如果打印机支持其他表单,可以通过在打印机驱动程序的 GPD 文件中描述这些表单,将它们添加到 Unidrv 打印机驱动程序中。 如果使用带有 *rcNameId 字段的资源 ID 和表单显示名称字符串的资源 DLL,则驱动程序将自动使用 Windows Vista Unidrv 打印机驱动程序提供的新本地化增强功能。 Unidrv 打印机驱动程序插件也会自动受益于对 Spooler 的这些更改,而无需进行任何额外修改。 有关这些增强功能的详细信息,请参阅 Windows Vista 中的打印机表单更改

如果 GPD 文件中的可本地化字符串没有使用资源 DLL,则应删除可本地化字符串,将其存储在资源 DLL 中,并在 GPD 文件中使用相应的资源 ID 替换这些字符串。

以下代码示例摘自一个使用资源 ID 作为显示名称的 GPD 文件。

*Feature: PaperSize
{
    *Option: Option2
    {
 *rcNameID: 259
        (form definition)
    }
    (other form definitions).
}

在 Windows Vista 提供的 Unidrv 打印机驱动程序中,FORM_INFO_2 结构由从 GPD 文件读取的数据填充,如下表所示。 如果打印机的 GPD 文件已包含填写此结构所需的信息,则无需进行任何更改即可使用 Windows Vista Unidrv 打印机驱动程序所提供的新功能。

typedef struct _FORM_INFO_2 { 
  DWORD    Flags; 
  LPTSTR   pName; 
  SIZEL    Size; 
  RECTL    ImageableArea;
  LPCSTR   pKeyword;
  DWORD    StringType;
  LPCTSTR  pMuiDll;
  DWORD    dwResourceId;
  LPCTSTR  pDisplayName;
  LANGID   wLangId; 
} FORM_INFO_2, *PFORM_INFO_2;
FORM_INFO_2 字段 使用的 GPD 值 字段说明
Flags FORM_PRINTER

此值由 Unidrv 打印机驱动程序分配,因为它正在添加表单。 此字段不会使用 GPD 文件中的值。
结构的属性。
pName 从资源 DLL 或 GPD 文件中的 *rcName 字段获取的表单本地化名称。 一个指向以 null 结尾的字符串的指针,该字符串指定表单的名称。 此字符串用于在表单数据库中标识表单,并且必须是唯一的。
大小 从 GPD 文件中的 *PageDimensions 选项读取的大小信息。 表单的宽度和高度,以千分之一毫米为单位。
ImageableArea 从 GPD 文件中的 *PrintableArea 选项读取的大小信息。 打印机可打印页面区域的宽度和高度(以千分之一毫米为单位)。
pKeyword GPD 文件中 *Option 条目的值。 一个指向表单的非本地化字符串标识符的指针。 当传递给 AddForm 或 SetForm 时,此指针为调用方提供了一种在所有本地语言中标识表单的方法。
StringType STRING_MUIDLL

如果 GPD 使用 *rcNameId 选项,且表单名称可从资源 DLL 获取,则会分配 STRING_MUIDLL 值。 如果在 GPD 文件中使用了 *rcName 选项,则该字段的值为 STRING_NONE。 此字段不会使用 GPD 文件中的值。
指定如何在运行时获取表单的本地化显示名称。
pMuiDll 如果使用 *rcNameId 选项,则为 GPD 文件中 *ResourceDLL 条目的值。 如果在 GPD 文件中使用了 *rcName 选项,则该字段的值为 NULL StringType 包含 STRING_MUIDLL 时,包含本地化显示名称的 MUI 本地化资源 DLL。
dwResourceId GPD 文件中 *rcNameID 条目的值。 如果在 GPD 文件中使用了 *rcName 选项,则该字段的值为 0。 StringType 包含 STRING_MUIDLL 时,表单显示名称的资源 ID(在 pMuiDll 中)。
pDisplayName NULL

此字段未使用。
StringType 包含 STRING_LANGPAIR 时,表单显示名称使用 wLangId 指定的语言。
wLangId 0

此字段未使用。
StringType 包含 STRING_LANGPAIR 时,pDisplayName 的语言。