次の方法で共有


非 COM ベースのレンダリング プラグイン

重要

プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。

詳細については、プリントサポートアプリデザインガイド.

プリンター ミニドライバーは、DRVENABLEDATA 構造体のメンバーを埋める OEMEnableDriver 関数を実装することによって、その機能をコア ドライバーに通知します。 この構造体の 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 を返すことによって呼び出しを無視できます。