ユーザー モードまたはカーネル モードを選択する

重要

Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。

詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください 。

プリンター グラフィックス DLL をユーザー モードで実行すると、カーネル モードでの実行よりも次の利点があります。

  • 無制限のスタック領域。

  • Win32 API へのアクセス。

  • システム クラッシュを引き起こす可能性が低い。

  • ユーザー モード デバッガーを使用した容易なデバッグ。

  • 浮動小数点機能の向上 (グラフィックス DDI 浮動小数点関数を使用する必要がないため)。

  • 説明されている Microsoft Windows 2000 以降のプリンター ドライバー アーキテクチャに含まれていない、ベンダーが提供するカスタマイズされたユーザー モード DLL を呼び出す機能

Windows Vista では、カーネル モードのプリンター ドライバーをインストールすることはできません。 アプリケーションがこれを試みると、AddPrinterDriver 関数と AddprinterDriverEx 関数 (Windows SDK ドキュメント内で説明) が失敗し、エラー コード ERROR_KM_DRIVER_BLOCKED が表示されます。

次の表は、許可されているプリンター ドライバーの実行モードを示しています。

オペレーティング システムのバージョン プリンター グラフィックス DLL の許可されている実行モード
Windows NT 4.0 kernel
Windows 2000 ユーザーまたはカーネル
Windows XP と Server 2003 既存のプリンターで使用可能なカーネル モード、新しいプリンターのインストールに必要なユーザー モード
Windows Vista ユーザー

グラフィックス DDI をユーザー モードで使用する

ユーザー モードのプリンター グラフィックス DLL は、GDI サポート サービスやその他の Eng プレフィックス付きグラフィックス DDI コールバック関数の呼び出しに限定されません。 ただし、次の規則に従う必要があります。

  • カーネル モードのグラフィックス DLL と同様に、ユーザー モード のグラフィックス DLL でも、描画サーフェイスを作成または変更するグラフィックス DDI を呼び出す必要があります。 これらのコールバック関数は GDI サポート サービスであり、これらの描画関数と同等の Win32 を呼び出すことはできません。

    ユーザー モードの DLL の場合、これらの描画コールバック関数の呼び出しはユーザー モードの GDI クライアントによってインターセプトされ、GDI のカーネル モードのグラフィックス レンダリング エンジン (GRE) への呼び出しが渡されます。

  • 次の Eng プレフィックス付きグラフィックス DDI 関数の一覧は、ユーザー モードの DLL では呼び出すことはできません。

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • ユーザー モードのプリンター グラフィックス DLL では、GDI 浮動小数点サービスのグラフィックス DDI 関数を引き続き使用できます。

既存のプリンター グラフィックス DLL をユーザー モードに変換する

カーネル モードで実行されるプリンター グラフィックス DLL を以前に開発したことがある場合は、DLL をユーザー モードでの実行に変換できます。 変換するには、DLL に DrvQueryDriverInfo 関数を追加し、プリンター グラフィックス DLL を構築するための規則に従います。

ユーザー モードで新しいプリンター グラフィックス DLL を作成する

ユーザー モードで実行される新しいプリンター グラフィックス DLL を開発するには、カーネル モードの DLL で使用されるすべてのグラフィックス DDI 関数を引き続き使用できます。 ただし、次のオプションもあります。

  • Win32 と完全に同等な Eng プレフィックス付き関数の場合は、Win32 関数を呼び出することをお勧めします。 次の表に、これらの Eng プレフィックス付き関数と同等の Win32 関数を示します。

    Eng プレフィックス付き関数 同等の Win32 関数
    EngAllocMem HeapAlloc
    EngAllocUserMem HeapAlloc
    EngEnumForms EnumForms
    EngFreeMem HeapFree
    EngFreeUserMem HeapFree
    EngFindImageProcAddress GetProcAddress
    EngGetForm GetForm
    EngGetLastError GetLastError
    EngGetPrinter GetPrinter
    EngGetPrinterData GetPrinterData
    EngGetPrinterDriver GetPrinterDriver
    EngLoadImage LoadLibrary
    EngMulDiv MulDiv
    EngSetLastError SetLastError
    EngSetPrinterData SetPrinterData
    EngUnloadImage FreeLibrary
    EngWritePrinter WritePrinter
  • 同様の機能を持つ Win32 関数に対応する Eng プレフィックス付き関数の場合は、Win32 関数を呼び出すこともできます。 次の表に、これらの Eng プレフィックス付き関数の一部と、Win32 の対応する関数を示します。

    Eng プレフィックス付き関数 同等の Win32 関数
    EngAcquireSemaphore EnterCriticalSection
    EngCreateSemaphore CRITICAL_SECTION オブジェクトを割り当て、Win32 InitializeCriticalSection 関数の呼び出しを使用して初期化します。
    EngDeleteSemaphore DeleteCriticalSection
    EngFindResource FindResource
    EngFreeModule FreeLibrary
    EngLoadModule LoadLibrary
    EngMultiByteToWideChar MultiByteToWideChar
    EngQueryLocalTime GetLocalTime
    EngReleaseSemaphore ReleaseSemaphore
    EngWideCharToMultiByte WideCharToMultiByte
  • 描画サービスを作成または変更する関数の場合、新しいドライバーは引き続き、同等の Win32 関数ではなく GDI サポート サービスを呼び出す必要があります。

  • GDI 浮動小数点サービスにグラフィックス DDI 関数を使用する代わりに、FLOAT データ型を使用できます。