ユーザー モードまたはカーネル モードを選択する
重要
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 では呼び出すことはできません。
ユーザー モードのプリンター グラフィックス 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 データ型を使用できます。