ターミナル サーバーの印刷
重要
WDK for Windows 11 バージョン 22H2 以降では、WDF 再頒布可能パッケージ共同インストーラーは未対応となりました。 この変更を回避する方法については、WDK の既知の問題に関する記事で「WDF 再頒布可能パッケージ共同インストーラーが機能しない」を参照してください。
Microsoft Windows は、複数のユーザーが単一のサーバシステムに接続できるようにするターミナル サービスをサポートしています。 このサーバー システムはターミナル サーバーと呼ばれます。 ターミナル サービスの詳細については、Windows SDK のドキュメントを参照してください。
Windows 用のプリンター ミニドライバーまたはドライバーを開発している場合、ターミナル サーバーに接続されているプリンターをサポートするために特別な操作を行う必要はありません。 ただし、Windows Driver Kit (WDK) で指定されているすべての設計、実装、およびインストールのガイドラインに従う必要があります。 具体的には、次のルールを使用する必要があります:
可能であれば、次のいずれかの Microsoft 提供ドライバーで動作するミニドライバーを提供して、プリンターをサポートします:
ユーザー モードで実行するには、Printer Graphics DLL を設計する必要があります。 ユーザー モードまたはカーネル モード の選択を参照してください。
デバイスをカスタム ドライバーでサポートする必要がある場合、ドライバーは Microsoft の プリンター ドライバー アーキテクチャに正確に準拠している必要があります。 具体的には、次のように使用します。
プリンター インターフェイス DLL を作成する必要があります。
Printer Graphics DLL を作成する必要があります。 この DLL はユーザー モードまたはカーネル モードで実行できますが、推奨はユーザー モードです。
カーネル モードのコードを作成する場合、ドライバー検証ツールを使用してコードをテストする必要があります。
プリンター ドライバーのインストールと構成の説明に従い、INF ファイルのセットアップを基にインストール手順を提供する必要があります。
すべてのカスタム ドライバー コードは再入可能にする必要があります。 ユーザー モード コードでは、重要なセクション オブジェクトを使用する必要があります (Windows SDK のドキュメントで説明)。 カーネル モード コードではセマフォを使用する必要があります (EngCreateSemaphore および関連する関数を参照)。
WDK の該当するセクションで説明されているように、プリンター ドライバーとカスタム スプーラー コンポーネントは、これらのドライバーとスプーラー コンポーネント専用に提供されるインターフェイスを介してのみレジストリにアクセスする必要があります。
インストールに関する考慮事項
通常、インストールには、ユーザーがプリンターの追加ウィザードを呼び出したときに Microsoft のプリンター クラス インストーラーが読み取ることができる INF ファイルの提供のみが必要となります。 場合によっては、カスタム セットアップ コード (共同インストーラーまたはクラス インストーラー) も必要になります。 カスタム セットアップ コードを作成する必要がある場合、次の点に注意してください:
ユーザーまたはセットアップ コードのいずれかが、ターミナル サーバーをインストール モードにする必要があります。 (詳細については、Microsoft Windows SDK ドキュメントを参照してください。)
システム ファイルは置き換えないでください。 Windows ファイル保護では、システム ファイルの置換が禁止されています。
可能な限りシステムの再起動の必要性を排除します。 次のガイドラインに従ってください。
変更されていないドライバー ファイルは置き換えないでください。 例えば、最新バージョンが既にインストールされている場合、複数のデバイスで共有されているファイルを更新しないでください。
ファイルを置き換える必要がある場合、セットアップ コードでは、古いバージョンをアンロードしてから新しいバージョンを読み込む手順を実行する必要があります (例として、ドライバー サービスを停止し、ファイルを置き換え、サービスを再起動します)。
システムの再起動を要求するのではなく、ユーザーにログオフと再ログオンを要求することをお勧めします。
共同インストーラーとクラス インストーラーの詳細については、クラス インストーラーと共同インストーラーの開発を参照してください。
カスタム セットアップ コードを記述する前に、Windows SDK ドキュメントに記載されているターミナル サービスのプログラミング ガイドラインを読お読みください。
ユーザー インターフェイスに関する考慮事項
ユーザーが実行するカスタム セットアップ コードでは、ユーザー インターフェイスを表示することができます。
ほぼすべてのプリンター ドライバー コードはスプーラーの実行コンテキストで実行されるため、ユーザー インターフェイスを表示することはできません。 ユーザー インターフェイスは、プリンター インターフェイス DLL または、次の関数内からのみ表示できます:
プロパティ ページを作成する DrvDevicePropertySheets 関数と DrvDocumentPropertySheets 関数。
プリンター イベントを識別するイベント コードを受け取る DrvPrinterEvent 関数。 この関数は、PRINTER_EVENT_ADD_CONNECTION および PRINTER_EVENT_DELETE_CONNECTION イベント コードに対してのみユーザー インターフェイスを表示できます。
他のすべてのプリンター ドライバー コードは、スプーラーのコンテキストで実行されます。 このコンテキストからは、MessageBox または MessageBoxEx の呼び出すことができますが、MB_SERVICE_NOTIFICATION を設定する必要があります。 これらの関数については、Windows SDK のドキュメントで説明されています。