不是基于 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 来忽略该调用。