不是基于 COM 的渲染插件

重要

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

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

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

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

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

IHV 可以实现 OEMLineTo,或者非基于 COM 的 DDI 挂钩函数中所述的任何其他挂钩函数,这样它就可以完全处理渲染操作,也可以回调以让核心驱动程序处理该操作。

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 来忽略该调用。