不是基于 COM 的渲染插件

重要

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

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

打印机微型驱动程序通过实现 OEMEnableDriver 函数(填充 DRVENABLEDATA 结构的成员)通知核心驱动程序其功能。 应使用 DRVFN 结构的数组地址设置此结构的 pdrvfn 成员。 此数组的每个元素应分别使用函数索引和 IHV 正在实现的 OEMXxx 函数之一的地址进行初始化。 (有关每个 OEMXxx 函数的详细说明,请参阅 非基于 COM 的 DDI Hook-Out Functions.)

当应用程序调用 Microsoft Win32 GDI 来执行呈现任务时,Win32 GDI 又调用 Unidrv 或 Pscript5 核心驱动程序,后者通常处理该任务。 但是,如果打印机微型驱动程序已指示它能够挂钩特定的呈现操作,则核心驱动程序会将呈现任务传递给 IHV 呈现插件。

例如,假设某个应用程序调用 Windows SDK 文档) 中所述的 Win32 LineTo API (。 通常,这会导致再次调用核心驱动程序的 DrvLineTo DDI 来绘制线条。 但是,如果打印机微型驱动程序已指示它打算挂接对此 DDI 的调用, DrvLineTo 会立即将调用转发到 IHV 的 OEMLineTo 函数。

IHV 可以实现 OEMLineTo非基于 COM 的 DDI Hook-Out Functions 中所述的任何其他挂钩函数,以便它可以完全处理呈现操作,也可以回调以让核心驱动程序处理该操作。

OEMLineTo 可以如以下伪代码示例所示实现:

BOOL APIENTRY
  OEMLineTo(
    SURFOBJ  *pso,
    CLIPOBJ  *pco,
    BRUSHOBJ  *pbo,
    LONG  x1,
    LONG  y1,
    LONG  x2,
    LONG  y2,
    RECTL  *prclBounds,
    MIX  mix
)
{
if ( OEM intends to handle the call ) {
 code to handle the call
}
else
// OEM calls Unidrv's DrvLineTo DDI
  bRetVal = (((PFN_DrvLineTo)(poempdev->pfnUnidrv[UD_DrvLineTo])) (
 pso,
            pco,
            pbo,
            x1,
            x2,
 y1,
            y2,
            prclBounds,
            mix,));
}

在前面的示例中,表达式

poempdev->pfnUnidrv[UD_DrvLineTo]

计算结果为核心驱动程序的 DrvLineTo DDI 的地址。 (PFN_DrvLineTo 前面) 表达式将函数指针强制转换为相应的类型。 本部分中列出的每个挂钩函数都与其自己的函数指针相关联。

请注意,当 OEMXxx DDI 回调 Unidrv 核心驱动程序且所涉及的图面是设备管理的表面时,Unidrv 只需通过返回 FALSE 来忽略调用。