次の方法で共有


XPS フィルターの実装

重要

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

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

すべての XPS フィルターは、IPrintPipelineFilter インターフェイスを実装する必要があります。

IPrintPipelineFilter::InitializeFilter メソッドの呼び出し中に、フィルターは次の処理を行う必要があります。

  1. IPrintPipelineManagerControl インターフェイスへのポインターをキャッシュします。

  2. IPrintPipelinePropertyBag インターフェイスで関連するデータを処理します。

  3. IInterfilterCommunicator インターフェイス (pIInterFilterCom) の IInterFilterCommunicator::RequestReader メソッドと IInterFilterCommunicator::RequestWriter メソッドを呼び出して、フィルターのプロバイダーインターフェイスとコンシューマー インターフェイスを初期化します。

データに PrintTicket セクションが含まれている場合は、Microsoft Win32 PrintTicket または PrintCapabilities API を使用してデータにアクセスできます。 XPSDrv に基づく UniDrv ドライバーと PScript5 ドライバーの場合、フィルターは、構成サービスとして IPrintCoreHelper インターフェイス コア Unidrv または PScript5 ドライバーにアクセスできます。

フィルターは、ドライバーの設計によっては、プロパティ バッグを介して独自の構成データにアクセスできる場合もあります。

フィルター間通信機能は、フィルター パイプライン 内のフィルター間の通信を処理するフィルター パイプライン マネージャーの一部です。 フィルター パイプライン マネージャーがフィルターを初期化すると、フィルターに対して定義されている読み取りと書き込みのインターフェイスをフィルターが取得できるように、フィルター間 Communicator インターフェイス (IInterFilterCommunicator) がフィルターに渡されます。

Microsoft は XPS ドキュメント インターフェイスとストリーム インターフェイスを提供していますが、そのフィルターに対して定義されている独自のフィルター間インターフェイスを作成できます。 Microsoft では、次のインターフェイスを提供しています。

  • XPS ドキュメント インターフェイスは、XPS スプール ファイルのさまざまな部分から読み取りと書き込みを行います。

  • XPS ストリーム インターフェイスは、データのシリアル ストリームの読み取りと書き込みを行います。 このインターフェイスを使用すると、ページ記述言語 (PDL) をフィルターから、PDL として XPS を使用しないプリンターに書き込むことができます。

フィルターは、XML Paper Specification (XPS) で定義されているレンダリング ルールと PrintTicket 処理ルールに準拠している必要があります。

フィルターは、Microsoft .NET 共通言語ランタイム (CLR) または Microsoft WinFX ランタイム コンポーネントに依存してはなりません。

パイプライン内のフィルターでは、ユーザー インターフェイスのコンテンツを表示することはできません。

次の推奨事項はフィルターに当てはまります。

  • フィルターでは、個別のプロセスまたはスレッドを作成しないでください。 別のプロセスまたはスレッドが必要な場合、フィルターはプロセスまたはスレッドの有効期間を適切に管理する必要があります。

  • フィルターには分離された機能が必要です。 すべての機能と実装をモジュール化する必要があります。 可能な限り、フィルター間の順序と機能の依存関係を排除します。

  • フィルターは、パイプラインに配置されたケースを順番に処理する必要があります。 フィルターが予期した順序でない場合は、クラッシュせず、状況を適切に処理する必要があります。 フィルターが別のフィルターに依存している場合、依存関係が指定されていない場合は、状況を適切に処理する必要があります。

フィルターに非同期通知を追加する方法の詳細については、印刷フィルターの非同期通知 を参照してください。