"操作を受け付ける操作受け付け手段と、前記操作受け付け手段が印刷開始又は送信開始の指示を受け付けた後、印刷又は送信の設定条件を表示し変更を受け付ける設定受け付け手段と、文書データ提供手段から印刷対象又は送信対象の文書データを取得して前記設定条件に基づき印刷装置の印刷データに変換する画像処理手段と、を有する情報処理装置であって、印刷開始又は送信開始の指示によりオペレーティングシステムが生成した印刷処理又は送信処理の識別情報を取得した前記設定受け付け手段が、オペレーティングシステムを介して前記識別情報をキーに前記設定条件を記憶させる設定条件記憶手段、を有し、オペレーティングシステムから前記識別情報を取得した前記画像処理手段が、前記識別情報をキーにオペレーティングシステムを介して前記設定条件記憶手段から前記設定条件を読み出し、該設定条件に基づき文書データを印刷装置の印刷データに変換する、ことを特徴とする情報処理装置。前記設定受け付け手段が、印刷開始又は送信開始の指示を受け付けた後、印刷又は送信の設定条件を表示する場合、前記設定受け付け手段はオペレーティングシステムの所定のAPI関数をコールすることで、前記画像処理手段から前記設定条件を取得する、ことを特徴とする請求項1記載の情報処理装置。前記設定受け付け手段は、印刷又は送信の前記設定条件を表示した後、前記操作受け付け手段が受け付けた印刷実行若しくは送信実行、又は、印刷中止若しくは送信中止の操作結果を取得し、前記設定条件と共に前記設定条件記憶手段に記憶し、前記画像処理手段が、前記設定条件記憶手段から読み出した前記操作結果が印刷中止若しくは送信中止である場合、文書データの印刷データへの変換を中止する、ことを特徴とする請求項1又は2記載の情報処理装置。前記設定条件記憶手段はLanguageMonitorであり、前記設定受け付け手段は、オペレーティングシステムの所定のAPI関数をコールすることで、LanguageMonitorに前記識別情報をキーにして前記設定条件を記憶する、ことを特徴とする請求項1~3いずれか1項記載の情報処理装置。前記画像処理手段は、オペレーティングシステムの所定のAPI関数をコールすることで、前記識別情報をキーにしてLanguageMonitorから前記設定条件を読み出す、ことを特徴とする請求項4記載の情報処理装置。オペレーティングシステムは、前記操作受け付け手段が印刷開始又は送信開始の指示を受け付ける毎に、当該情報処理装置内で一意の前記識別情報としてJobIDを生成する、ことを特徴とする請求項1~5いずれか1項記載の情報処理装置。オペレーティングシステムは、異なる前記文書データ提供手段が提供した文書データの印刷処理又は送信処理に対し一意の前記識別情報を生成し、同じ前記文書データ提供手段が提供した異なる文書データの印刷処理又は送信処理に対し一意の前記識別情報を生成し、同じ前記文書データ提供手段が提供した同じ文書データの異なる印刷処理又は送信処理に対し一意の前記識別情報を生成する、ことを特徴とする請求項6記載の情報処理装置。前記操作受け付け手段が印刷開始又は送信開始の指示を受け付けた後、オペレーティングシステムが印刷装置に依存しない中間印刷データを生成するまでに、前記設定受け付け手段が、前記識別情報をキーにして前記設定条件を前記設定条件記憶手段に記憶しておき、オペレーティングシステムが前記文書データ提供手段を印刷処理又は送信処理から開放した後、オペレーティングシステムに呼び出された前記画像処理手段が、前記識別情報をキーに前記設定条件記憶手段から前記設定条件を読み出す、ことを特徴とする請求項1~7いずれか1項記載の情報処理装置。第1の情報処理装置、第2の情報処理装置、及び、印刷装置がネットワークを介して接続されたシステムにおいて、前記操作受け付け手段が印刷開始又は送信開始の指示を受け付けた後、印刷又は送信の設定条件を表示し変更を受け付ける設定受け付け手段と、文書データ提供手段から印刷対象又は送信対象の文書データを取得して前記設定条件に基づき印刷装置の印刷データに変換する画像処理手段と、印刷開始又は送信開始の指示により前記第2の情報処理装置のオペレーティングシステムが生成した印刷処理又は送信処理の識別情報を取得した前記設定受け付け手段が、前記第1及び前記第2の情報処理装置のオペレーティングシステムを介して前記識別情報をキーにして前記設定条件を記憶させる、前記第2の情報処理装置に設けられた設定条件記憶手段、を有し、前記第2の情報処理装置のオペレーティングシステムから前記識別情報を取得した前記画像処理手段が、少なくとも前記第2の情報処理装置のオペレーティングシステムを介して前記識別情報をキーに前記設定条件記憶手段から前記設定条件を読み出し、該設定条件に基づき文書データを印刷装置の印刷データに変換する、ことを特徴とするシステム。前記操作受け付け手段、前記設定受け付け手段、及び、前記画像処理手段を前記第1の情報処理装置が有し、前記第1の情報処理装置は印刷データを前記第2の情報処理装置に送信する、ことを特徴とする請求項9記載のシステム。前記操作受け付け手段、及び、前記設定受け付け手段を前記第1の情報処理装置が有し、前記画像処理手段を前記第2の情報処理装置が有し、前記第1の情報処理装置は、第1の情報処理装置のオペレーティングシステムが文書データから変換した印刷装置に依存しない中間印刷データを前記第2の情報処理装置に送信し、前記画像処理手段は、前記識別情報をキーに前記第2の情報処理装置の前記設定条件記憶手段から前記設定条件を読み出し、該設定条件に基づき中間印刷データを印刷装置の印刷データに変換する、ことを特徴とする請求項9記載のシステム。操作を受け付ける操作受け付け手段、を有する情報処理装置に、前記操作受け付け手段が印刷開始又は送信開始の指示を受け付けた後、印刷又は送信の設定条件を表示し変更を受け付ける設定受け付けステップと、印刷開始又は送信開始の指示によりオペレーティングシステムが生成した印刷処理又は送信処理の識別情報を設定モジュールが取得する識別情報受け付けステップと、オペレーティングシステムを介して、前記識別情報をキーにして前記設定条件を設定条件記憶手段に記憶させるステップと、オペレーティングシステムから画像処理モジュールが前記識別情報を取得するステップと、前記画像処理モジュールが、前記識別情報をキーにオペレーティングシステムを介して前記設定条件記憶手段から前記設定条件を読み出すステップと、前記画像処理モジュールが、文書データ提供手段から提供された印刷対象又は送信対象の文書データを、前記設定条件記憶手段から読み出した前記設定条件に基づき印刷装置の印刷データに変換するステップと、を実行させるプログラム。しかしながら、一時ファイルを使う手法では、プリンタドライバが動作しているタイミングやユーザの権限レベルによって、プリンタドライバが一次ファイルに確実に出力できるとは限らないという問題がある。また、仮に、一時ファイルに出力できたとしても複数アプリケーションが動いている環境では設定が上書きされてしまう可能性がある。図4は、複数アプリと一時ファイルの関係を模式的に説明する図の一例である。アプリケーション1,2は一台のPCで動作している、それぞれ文書データを印刷可能なアプリケーションである。アプリケーション1の要求を受けてUIドライバが一時ファイルに設定を書き込む。アプリケーション2の要求を受けてUIドライバが一時ファイルに設定を書き込む。アプリケーション1の要求を受けて描画ドライバが一時ファイルの設定を読み込む際には、一時ファイルの内容が書き換わっている。この問題を解決するために、印刷設定を保存する場所を一時ファイルとするのでなく、印刷設定保持用モジュールを利用して、そこに印刷設定を保持させる方法を用い、上記の問題を解消することは可能であった。しかし、この方法でも解消できないケースが2つある。Aについて:EMFスプールでの印刷シーケンスのケースBについて:PointPrintインストールしたプリンタドライバでの印刷シーケンスのケースAについて印刷設定保持用モジュールを使用した方法は、印刷時のDDIコールシーケンスを利用しており、RAWスプールの時は実現可能である。しかし、スプール形式が異なると、OSから呼ばれるDDIコールシーケンスが変化する。EMFスプールでは、アプリケーションからの文書データをEMFデータに変換する処理と、EMFデータをプリンタが解釈可能な描画データに変換する処理とがある。このため、OS内部の動作として、2回の印刷処理シーケンスが動作する。この結果、DDIコールシーケンスがRAWスプールよりも複雑になってしまうため、期待するタイミングで印刷設定の受け渡しができない。Bについて印刷設定保持用モジュールを使用した方法は、ローカル環境で、ユーザが使用するPCにプリンタドライバをインストールした場合は実現可能である。しかし、PointPrintというインストール形式では、ユーザの設定によってUIドライバと描画ドライバが動作する場所が異なるようにすることができるサーバサイドレンダリング。クライアントサイドレンダリングでは、UIドライバ、描画ドライバともにクライアントPC側で動作するが、サーバサイドレンダリングでは、UIドライバはクライアントPC側で動作し、描画ドライバはサーバPC側で動作をする。このサーバサイドレンダリングでは、そもそも動作するPCが物理的に別であるため、印刷設定保持モジュールがクライアントPC側にしか存在しない状況になる。この場合、サーバの描画ドライバは印刷設定保持モジュールから印刷設定を取得できない。図5は、従来技術における、印刷開始後の印刷設定の変更の実現可否状況を一覧にした図の一例である。上記のように、インストール環境がローカルでスプール形式がEMFスプールの場合、及び、インストール環境がPointPrintでスプール形式がEMFスプールでレンダリング場所がサーバの場合、印刷開始後の印刷設定の変更が困難である。本発明は、上記課題に鑑み、印刷開始後の印刷設定を、スプール形式の違いやプリンタドライバのインストール環境に関係なく可能とする情報処理装置を提供することを目的とする。本発明は、操作を受け付ける操作受け付け手段と、印刷対象又は送信対象の文書データを提供する文書データ提供手段と、前記操作受け付け手段が印刷開始又は送信開始の指示を受け付けた後、印刷又は送信の設定条件を表示し変更を受け付ける設定受け付け手段と、文書データを取得して前記設定条件に基づき印刷装置の印刷データに変換する画像処理手段と、を有する情報処理装置であって、印刷開始又は送信開始の指示によりオペレーティングシステムが生成した印刷処理又は送信処理の識別情報を取得した前記設定受け付け手段が、オペレーティングシステムを介して前記識別情報をキーにして前記設定条件を記憶させる設定条件記憶手段、を有し、オペレーティングシステムから前記識別情報を取得した前記画像処理手段が、前記識別情報をキーにオペレーティングシステムを介して前記設定条件記憶手段から前記設定条件を読み出し、該設定条件に基づき文書データをプリンタの印刷データに変換する、ことを特徴とする。印刷開始後の印刷設定を、スプール形式の違いやプリンタドライバのインストール環境に関係なく可能とする情報処理装置を提供することができる。以下、本発明を実施するための形態について図面を参照しながら説明する。図6は、本実施形態のプリンタドライバの概略的な特徴を説明する図の一例である。PCPersonalComputerがWindowsR系のOS上でアプリケーションを実行している。WindowsR系の印刷アーキテクチャでは、図示するようなソフトウェア階層により、アプリケーションの文書データがプリンタにより印刷される。ここではスプール形式を区別していない。WindowsR系OSのクライアント系には、WindowsRNT、WindowsR98、WindowsR2000、WindowsRMe、WindowsRXP、WindowsRVista、WindowsR7及びこれ以降のバージョンのOSが含まれる。サーバ系には、WindowsR2000Server、2003Server、2008Server及びこれ以降のバージョンのOSが含まれる。1.アプリケーション印刷処理開始2.アプリケーションがOSのGDIAPIを呼び出すプリンタデバイスコンテキストの確保。3.プリンタドライバ30が描画データを生成する4.LanguageMonitor32が必要な処理を行う5.ポートモニタ33が、プリンタポートの種類に合わせて出力処理を行う6.プリンタに描画データが送信される本実施例では、このような印刷アーキテクチャにおいて、OS10が生成するJobIDとLanguageMonitor32を利用する。OS10は印刷ジョブの1つ1つにJobIDを付与する。JobIDはプリンタドライバ30に通知される。WindowsR系OSでは、プリンタドライバ30は、OS10が提供するLanguageMonitor32を使用してもメーカプリンタメーカ、FAXメーカ等が提供するLanguageMonitor32を使用してもよいとされている。本実施形態では、LanguageMonitor32を単にポートモニタ33とのインタフェースとするのでなく、印刷設定とJobIDを対応づけて記憶する手段として利用する。プリンタドライバ30のUIドライバは、アプリケーションから取得した印刷設定と共にJobIDをLanguageMonitor32に通知する。LanguageMonitor32は印刷設定とOSが生成したJobIDを対応づけて記憶する。LanguageMonitor32はJobIDをキーに印刷設定を管理するので、他のアプリケーションが印刷設定を上書きするようなことはない。また、描画ドライバが印刷設定を読み出す際、JobIDを指定することでUIドライバが生成した印刷設定を、LanguageMonitor32から取得することができる。このように、描画ドライバは一意に印刷設定を特定できる。また、LanguageMonitor32は、WindowsR系OSの機能なので、PointPrint環境のサーバPC上で利用可能である。このため、UIドライバはサーバPCのLanguageMonitor32にアクセスできるし、サーバPCの描画ドライバが描画処理する際も、LanguageMonitor32からJobIDで指定した印刷設定を取得することができる。このように、本実施形態の印刷設定の管理手法は、PointPrint環境においてもローカルインストールされたプリンタドライバと同様に有効である。したがって、本実施形態の印刷設定の管理方法は、スプール形式及びインストール環境に関係なく、印刷開始後の印刷設定の変更が可能である。構成例図7aは印刷システム400の概略構成図の一例を、図7bはPC100のハードウェア構成図の一例をそれぞれ示す。PC100とプリンタ200がネットワーク300を介して接続されている。プリンタ200は1台のみあればよい。PC100がユーザの操作を受け付け、文書作成ソフトなどのアプリケーションが、GDI、DDI及びプリンタドライバ等を利用して印刷を要求する。プリンタドライバ30は、後述する手順で印刷データを作成してプリンタ200に送信する。プリンタ200は画像形成機能を有していれば、コピー機、複写機、FAX装置などその呼称は問われない。また、プリンタ200は電子写真方式の画像形成機能又はインクジェット方式の画像形成機能のどちらの機能を有していてもよい。また、PCPersonalComputer100とプリンタ200はUSBケーブルなどで直接接続されていてもよい。PC100は、それぞれバスで相互に接続されているCPU11、ROM12、RAM13、外部I/F14、通信装置15、入力装置16、表示制御部17及び記憶装置18を有する。CPU11は、OSOperatingSystem10、アプリケーション31、及び、プリンタドライバ30を記憶装置18から読み出して、RAM103を作業メモリにして実行する。アプリケーション31は、プリンタ200に印刷要求するものであればよく、例えば、文書作成ソフト、ブラウザソフト、プレゼン資料作成ソフト等、種々のものがある。印刷対象となる文書データを、作成、編集、表示、管理などして、印刷可能なアプリケーションであればどのようなものでもよい。なお、文書データは、文字や記号、数値だけを含むものではなく、画像、写真など種々の印刷対象物を含む。RAM13は必要なデータを一時保管する作業メモリ主記憶メモリになり、ROM12にはBIOSや初期設定されたデータ、スタートプログラム等が記憶されている。外部I/F14はUSBケーブル等のケーブルや、可搬型の記憶媒体20を装着するインタフェースである。通信装置15は、LANカードやイーサネット登録商標カードであり、CPU11からの指示によりプリンタ200にパケットデータ本実施形態では主に印刷データを送信する。入力装置16は、キーボード、マウスなど、ユーザの様々な操作指示を受け付けるユーザインターフェイスである。タッチパネルや音声入力装置を入力装置とすることもできる。表示制御部17は、アプリケーション31が指示する画面情報に基づき所定の解像度や色数等でディスプレイ19の描画を制御する。ディスプレイ19は、液晶や有機ELなどのFPDFlatPanelDisplayである。記憶装置18は、HDDHardDiskDriveやフラッシュメモリなどの不揮発メモリを実体とし、OS10、プリンタドライバ30、及び、アプリケーション31を記憶している。記憶媒体20は、例えば、SDカードやUSBメモリなど不揮発性のメモリである。OS10、アプリケーション31、及び、プリンタドライバ30は、記憶媒体20に記録された状態又は不図示のサーバからダウンロードされる態様で配布される。図8は、PC100及びプリンタドライバ30の機能ブロック図の一例である。PC100は、WindowsR系OS上で動作する、アプリケーション31、プリンタドライバ30、LanguageMonitor32、及び、ポートモニタ33を有する。このうち、LanguageMonitor32、及び、ポートモニタ33がOS10により提供されため、広義ではOS10の一部である。この他のGDI、スプーラ、プリンタプロセッサなどは省略したが、OS10と共にPC100にインストールされている。プリンタドライバ30は、UIドライバ38と描画ドライバ39を有している。さらにUIドライバ38は表示部381を有する。UIドライバ38の表示部381は、ユーザがアプリケーションに対して文書の印刷操作を入力することで、印刷設定画面印刷ダイアログと呼ばれることがあるをディスプレイ19に表示する。ユーザは、印刷設定画面に対し、部数や両面などといった設定、集約製本変倍等の設定を行うことができる。また、UIドライバ38の表示部381は、ユーザが印刷開始指示を入力した後も、印刷設定画面をディスプレイ19に表示して、印刷設定の変更を受け付けることができる。印刷設定は、DEVMODE構造体以下、DEVMODEというという構造体データテーブルに格納される。DEVMODEはOS上で動作する各種のプリンタドライバ30に対して印刷条件を共通に設定するためのメンバ変数が定義されたデータ構造である。描画ドライバ39は、DEVMODEを参照して、アプリケーション31によって印刷対象の文書データから印刷設定を反映した印刷データを作成する。なお、印刷データには描画データ例えばPDLデータと制御データ例えばPJLの印刷コマンドが含まれる。LanguageMonitor32はプリンタドライバ30との結合性が高いモジュールである。LanguageMonitor32は、ポートモニタ33に送信する印刷データをフィルタリングすることができる。本実施例のLanguageMonitor32は、データ保持部321と通信部322を有する。このうち、通信部322は、プリンタドライバ30がポートモニタ33に印刷データを送信する際に、通信を制御するものであり、従来のLanguageMonitor32が有している。通信部322はプリンタ200からのメッセージを受信することもできる。これに対し、データ保持部321は、JobIDをキーに印刷設定を対応づけて記憶する。データ保持部321は、LanguageMonitor32の機能を利用してプリンタドライバ30により実現される。このため、OS10の変更は必要ないか、あったとしてもわずかである。データ保持部321については後述する。図9は、LanguageMonitor32の動作を説明する図の一例である。LanguageMonitor32はプリントプロセッサ41から送信された印刷データを受け取り、ポートモニタ33に送信する。ポートモニタ33は、通信プロトコルに基づく処理を行い、ポートドライバ43に印刷データを送信する。ポートドライバ43は、プリンタ200とPC100との接続インタフェースUSBNIC等を制御して、印刷データをプリンタ200に送信する。従来のWindowsR系OSの印刷アーキテクチャ図10は、WindowsR系OSの印刷アーキテクチャにおける、描画ドライバ39とUIドライバ38について説明する図の一例である。OS10のGDI34はDDIコールによりプリンタドライバ30のUIドライバ38と描画ドライバ39を呼び出す。UIドライバ38と描画ドライバ39は、直接相互にやりとりをすることができない。しかし、OS10からのドライバの呼び出しIFであるDDIの引数にDEVMODEがあることにより、双方がDEVMODEを参照することができる。OS10から呼び出されたUIドライバ38は、ユーザの印刷設定を受け付けDEVMODEに保存するDEVMODEは印刷準備開始時にOS10から描画ドライバ39に渡されるすなわち、UIドライバ38は、印刷設定を決定し、描画ドライバ39は印刷設定を印刷準備開始時に受け取り、印刷設定に基づき印刷コマンドや描画データを生成する。これがWindowsR系OSの印刷アーキテクチャの基本的な印刷シーケンスとなる。描画ドライバ39は、UIドライバ38に続いて処理するので、一般的なプリンタドライバ30では、ユーザの印刷開始指示後に印刷設定を変更することはできない。図11は、RAWスプールにおける、WindowsR系OSの印刷アーキテクチャの流れを説明する図の一例である。1ユーザが、UIドライバ38が提供する印刷ダイアログGUIによって印刷設定を変更するすでに登録されている初期値を変更する。2ユーザがアプリケーションに印刷開始指示の操作を行う。3アプリケーションはUIドライバ38と印刷設定が入っているDEVMODEをやりとりして、ユーザの印刷設定を受け取る。4アプリケーションはGDI34に印刷命令とDEVMODEをGDIコールとして伝える。5GDI34はGDIコールをDDIコールに変換して描画ドライバ39に伝える。6描画ドライバ39は、プリンタが理解できる言語に変換したRAWデータをスプーラ35に送出する。7スプーラ35は、描画ドライバ39から受け取ったRAWデータをプリンタ200に送信する。図12は、図11のWindowsR系OSの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはGDI34とUIドライバ38、又は、GDI34と描画ドライバ39の間では、不図示の通信が行われているが省略している。GDI34からUIドライバ38へのメッセージはUI系のDDI関数で、描画ドライバ39へのメッセージは描画系DDI関数でそれぞれ通知される。この図12のS1までにUIドライバ38はユーザが設定した印刷設定を受け付けており、ユーザが印刷開始を操作するとアプリケーション31がDEVMODEに格納された印刷設定を取得する。S1アプリケーション31はまず、GDI34に印刷準備開始を指示する。具体的には、アプリケーションはCreateDC関数で印刷設定DEVMODEを引数にしてGDI34をコールする。S11GDI34はAPIに対応するDDIをコールすることで、描画ドライバ39に印刷設定を送出する。CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S2GDI34が印刷準備完了をアプリケーションに通知すると、アプリケーションはGDI34に印刷開始を指示する。具体的には、アプリケーションはStartDoc関数でDocINFOなどを引数にしてGDI34をコールする。S21GDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCPREをUIドライバ38に送出する。S22GDI34は描画ドライバ39に印刷開始を指示する。具体的にはDrvStartDoc関数を描画ドライバ39に送出する。OS10は、CreateDC関数により所定のタイミングでJobIDを生成している。GDI34はDrvStartDoc関数の引数にJobIDを設定するので、描画ドライバ39はJobIDを参照できるようになる。S23同様にGDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTをUIドライバ38に送出する。GDI34はこの関数の引数にJobIDを設定するので、UIドライバ38はJobIDを参照できるようになる。S3GDI34が印刷開始完了をアプリケーションに通知すると、アプリケーションはページ単位の処理を繰り返す。まず、アプリケーションはGDI34に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーションはStartPageをGDI34に送出する。S31GDI34はDrvStartPageを描画ドライバ39に送出する。S4アプリケーションは、描画ドライバ39から応答を取得すると、描画関数文書データをGDI34に送出する。S41GDI34は、描画関数文書データを描画ドライバ39に送出する。描画ドライバ39は印刷設定に従って文書データを印刷データに変換する。S5GDI34が1ページ分の描画処理の完了をアプリケーションに通知すると、アプリケーションは1ページ分の書き込みが終了したことをGDI34に通知する。具体的には、アプリケーションはEndPageをGDI34に送出する。S51GDI34は描画ドライバ39に1ページ分の書き込みが終了したことを通知する。具体的には、GDI34はDrvSendPageを描画ドライバ39に送出する。S6アプリケーションは、全てのページの描画処理が終了すると、印刷ジョブの終了をGDI34に通知する。具体的には、アプリケーションはEndDocをGDI34に送出する。S61GDI34は印刷ジョブの終了を描画ドライバ39に送出する。具体的には、GDI34はEndDocを描画ドライバ39に送出する。S62GDI34は印刷ジョブの終了をUIドライバ38に送出する。具体的には、GDI34はDrvDocumentEventDOCUMENTEVENTENDDOCPOSTをUIドライバ38に送出する。この後、デバイスコンテキストが消去され、描画ドライバ39は印刷設定を参照できなくなる描画ドライバ39にDrvDisablePDEVのDDIコールが通知される。図13は、EMFスプールにおける、WindowsR系OSの印刷アーキテクチャの流れを説明する図の一例である。1ユーザが、UIドライバ38が提供する印刷ダイアログGUIによって印刷設定を変更するすでに登録されている初期値を変更する。2ユーザがアプリケーションに印刷開始指示の操作を行う。3アプリケーションはUIドライバ38と印刷設定が入っているDEVMODEをやりとりして、ユーザの印刷設定を受け取る。4アプリケーションはGDI34に印刷命令をGDIコールとして通知する。5GDI34はEMFデータをスプールデータとしてスプーラ35に渡す。6アプリケーションの印刷データが一通りスプールされると、スプーラ35がプリントプロセッサ41にデスプールすることを伝え、スプールデータを渡す。7プリントプロセッサ41は、スプールデータをページごとに編集することで、集約逆順製本の機能を実現し、編集した内容をGDI34にGDIコールとして通知する。8GDI34はGDIコールをDDIコールに変換して描画ドライバ39に通知する。9描画ドライバ39は、プリンタが理解できる言語に変換したRAWデータをスプーラ35に送出する。10スプーラ35は、描画ドライバ39から受け取ったRAWデータをプリンタに送信する。図14は、図13のWindowsR系OSの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはGDI34とUIドライバ38、又は、GDI34と描画ドライバ39の間では、不図示の通信が行われているが省略している。また、EMFスプールでは、アプリケーションプロセスとスプーラプロセスが分かれている。なお、この図14のS1までにUIドライバ38はユーザが設定した印刷設定を受け付けており、ユーザが印刷開始を操作するとアプリケーションがDEVMODEに格納された印刷設定を取得する。S1アプリケーションはまず、GDI34に印刷準備開始を指示する。具体的には、アプリケーションはCreateDC関数で印刷設定を引数にしてGDI34をコールする。S11GDI34はAPIに対応するDDIをコールすることで、描画ドライバ39に印刷設定を送出する。CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S2GDI34が印刷準備完了をアプリケーションに通知すると、アプリケーションはGDI34に印刷開始を指示する。具体的には、アプリケーションはStartDoc関数でDocINFOなどを引数にしてGDI34をコールする。S21GDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCをUIドライバ38に送出する。S22GDI34はUIドライバ38にJobIDを送出する。具体的にはDrvDocumentEventDOCUMENTSTARTDOCPOSTをUIドライバ38に送出する。GDI34はこの関数の引数にJobIDを設定するので、UIドライバ38はJobIDを参照できるようになる。この時点では描画ドライバ39はJobIDを取得していない。S3GDI34が印刷開始完了をアプリケーション31に通知すると、アプリケーションページ単位の処理を繰り返す。まず、アプリケーションはGDI34に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーションはStartPageをGDI34に送出する。StartPageによりスプーラプロセスが開始される。S4アプリケーション31は、描画関数文書データをGDI34に送出する。GDI34は、印刷設定に基づきEMFデータを作成する。S5アプリケーション31は1ページ分の書き込みが終了したことをGDI34に通知する。具体的には、アプリケーションはEndPageをGDI34に送出する。S6アプリケーション31は、全てのページの描画処理が終了すると、印刷ジョブの終了をGDI34に通知する。具体的には、アプリケーションはEndDocをGDI34に送出する。このように、アプリケーションのプロセスが終了すると、印刷が完了していなくてもアプリケーションは印刷を終了したように見える。この後、スプーラプロセスで再度印刷処理がかかり、ここでEMFデータからRAWデータへ変換される。OS10はアプリケーション31とGDI34の通信を監視して、所定のタイミングになると例えばStartPageの後、スプーラ35にスプーラプロセスを開始させる。S7スプーラ35は、プリントプロセッサ41に印刷準備開始を指示する。S71プリントプロセッサ41はGDI34に印刷準備開始を指示する。S711GDI34は描画ドライバ39に印刷設定を送出する。具体的には、CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S712GDI34は描画ドライバ39に印刷開始を指示する。具体的にはDrvStartDoc関数を描画ドライバ39に送出する。OS10は、CreateDC関数により所定のタイミングでJobIDを生成している。GDI34はDrvStartDoc関数の引数にJobIDを設定するので、描画ドライバ39はJobIDを参照できるようになる。S72以降、プリントプロセッサ41はページ単位の処理を繰り返す。まず、プリントプロセッサ41はGDI34に新しいページの印刷データを受け入れるよう指示する。具体的には、プリントプロセッサ41はGdiStartPageEMFをGDI34に送出する。S721GDI34はDrvStartPageを描画ドライバ39に送出する。S722GDI34は、描画関数文書データを描画ドライバ39に送出する。描画ドライバ39は印刷設定に従って文書データを印刷データに変換する。S723GDI34は描画ドライバ39に1ページ分の書き込みが終了したことを通知する。具体的には、GDI34はDrvSendPageを描画ドライバ39に送出する。以降は、ページ単位の繰り返しになる。本実施形態のWindowsR系OSの印刷アーキテクチャまず、本実施形態の印刷アーキテクチャで使用するAPI等について説明する。図15aはExtEscape関数の書式を説明する図の一例である。ExtEscape関数は、モジュールシーケンス図や機能ブロック図の各ブロックがGDI経由ではアクセスできない特定のモジュールにアクセスするためのAPIである。アプリケーションがGDI34を関与させずにドライバにデータを送信する場合、モジュールからGDI34を関与させずにデータを取得する場合に利用されることがある。hdcはデバイスコンテキストのハンドルである。nEscapeはExtEscape関数の機能をチェックしたり設定するための引数になる。cbInputは、ExtEscape関数で送信する構造体のサイズである。lpszInDataは、ExtEscape関数で送信する構造体のポインタである。cbOutputは、ExtEscape関数で送信される構造体を受け取る構造体のサイズである。lpszOutDataは、ExtEscape関数で送信される構造体を受け取る構造体のポインタである。ExtEscape関数は、CreateDCにより取得されたデバイスコンテキストに対して、コール可能なAPIである。よって、UIドライバ38等はシーケンス処理中のデバイスコンテキストがある範囲でExtEscape関数をコールすることができる。図15bは、アプリケーションがExtEscapeをコールした場合のシーケンス図の一例を示す。アプリケーションがGDI34に対しExtEscapeをコールする。GDI34はExtEscapeをDrvEscapeというDDIコールに変換して描画ドライバ39に通知する。また、この逆に描画ドライバ39又はUIドライバ38がExtEscapeをコールすることも可能である。ExtEscapeはCreateDC~DeleteDC間であれば、各モジュールがコールできるので、図15bのシーケンスは、図12,14の従来のシーケンス図の任意の場所に入れることができる。図16aは、DrvDocumentEvent関数の書式を説明する図の一例である。DrvDocumentEvent関数は、文書データの印刷に関連する特定のイベントを処理するDLLである。hPrinterは、プリンタのハンドルである。hdcは、デバイスコンテキストのハンドルである。iEscは、呼び出し元のモジュールが提供する、処理対象のイベントを識別するためのエスケープコードである。cbInはpvInで送信されるデータのサイズである。pvInは送信されるデータのポインタである。cbOutは、iEscがDOCUMENTEVENTESCAPEの場合は、ExtEscapeのcbOutputパラメータとして関数が指定した値が格納される。iEscがDOCUMENTEVENTQUERYFILTERの場合、受け取り側が受け取る構造体pvOutのサイズが格納される。pvOutは、受け取り側が受け取る構造体pvOutのポインタである。本実施例では、DrvDocumentEvent関数は、CreateDC以降の印刷中、GDI34等が描画ドライバ39を呼び出すDDIコールの間に、適宜、コールされる。DrvDocumentEventは単独の処理を行うためのDDIなので、前後のDrvDocumentEvent間でデータの共有はできない。この点で、描画ドライバ39を呼び出すDDIとは異なる。UI系のDDIなのでダイアログ表示をすることも可能である。また、引数にデバイスコンテキストhdcがあるため、DrvDocumentEventのDDIコールの後、モジュールがデバイスコンテキストを必要とするAPIをコールすることができる。例えば、UIドライバ38がデバイスコンテキストを引数に描画系APIをコールすると、対応している描画ドライバ39に対して描画命令を通知することができる。図16bは、SendRecvBidiDataFromPortの書式を説明する図の一例である。SendRecvBidiDataFromPort関数は、LanguageMonitor32に実装される関数である。プリンタドライバ30と同じようにLanguageMonitor32にもOS10によって決められたIFが存在する。SendRecvBidiDataFromPort関数は、その1つであり、アプリケーションとプリンタ間、アプリケーションとプリントサーバ間の双方向通信をサポートする。hPortは、呼び出し元のモジュールによって与えられるポートのハンドルである。dwAccessBitは、呼び出し元のモジュールによって与えられ、プリンタ又はプリントサーバへのアクセスを許可するACCESSMASK構造体である。pActionは、呼び出し元のモジュールによって与えられるリクエストアクションである。pReqDataは、リクエストデータを有しているPBIDIREQUESTCONTAINER構造体のポインタである。ppResDataは、レスポンスデータを有しているBIDIRESPONSECONTAINER構造体のアドレスを受け取るメモリ領域へのポインタである。図17aはPBIDIREQUESTCONTAINER構造体の書式を示す図の一例である。PBIDIRESPONSECONTAINER構造体についてもほぼ同様である。PBIDIREQUESTCONTAINER構造体は、bidirequestsのリストを格納するコンテナであり、PBIDIRESPONSECONTAINER構造体はbidiRESPONSEのリストを格納するコンテナである。WindowsR系のOS10はBidiRequestandResponseSchemasとして、プリンタとアプリケーションの間で双方向通信のために使用可能な、問い合わせと応答の組を提供するデータベースのスキーマを提供している。このRequestとResponseに、JobIDと印刷設定を登録すれば、OS10の仕組みを利用してモジュールがJobIDをキーに印刷設定を取得できる。versionは、スキーマのバージョンであり現在は1である。Flagsは、システムOS10により予約されたフラグのセットでありゼロでなければならない。Countは、aDataメンバーにおけるbidirequestsの数である。aDataは、BIDIREQUESTDATA構造体の配列であり、各要素が1つのbidirequestを有している。図17bはBIDIREQUESTDATA構造体の書式の一例を示す図である。BIDIREQUESTDATA構造体は、1つのbidirequestを格納している。dwReqNumberは、リクエストのインデックスであり、マルチリクエストによる操作のリクエストと応答を適合させるために使用される。pSchemaは、スキーマ文字列の最初の1バイトがあるメモリ配置へのポインタである。dataは、スキーマに従ったBIDIDATA構造体である。<LanguageMonitorへのJobIDと印刷設定の格納>従来から、OS10は印刷開始命令を受け付けた順にシステムで一意のIDJobIDを生成している。RAWスプールとEMFスプールのいずれでも、描画ドライバ39及びUIドライバ38がJobIDを取得するステップがある。すなわち、描画ドライバ39は、DrvStartDocの引数で受け取ることができる。UIドライバ38は、DrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTの引数で受け取ることができる。図18は、OS10が付与するJobIDを模式的に説明する図の一例である。アプリケーションA及びアプリケーションBが任意に印刷開始命令1~3を発行する。OS10は、アプリケーションAの印刷開始命令1にJobID1を付与し、アプリケーションBの印刷開始命令2にJobID2を付与し、アプリケーションAの印刷開始命令3にJobID3を付与している。描画ドライバ39及びUIドライバ38はこれらのJobIDを取得するので、描画ドライバ39及びUIドライバ38が取得するJobIDも一意性が保証される。本実施形態では、このJobIDをキーにしてLanguageMonitor32に印刷設定を記憶させる。図19は、LanguageMonitor32に記憶されるJobIDと印刷設定を模式的に説明する図の一例である。アプリケーションABは、以下のように印刷開始を指示している。印刷開始が指示された順に、OS10によってJobIDが振られる。1アプリケーションAが印刷開始指示2アプリケーションBが印刷開始指示3アプリケーションAが印刷開始指示UIドライバ38は、印刷開始後に印刷設定画面を表示し印刷設定を受け付ける。そして、その印刷設定を、JobIDをキーにしてLanguageMonitor32に設定setする。図の例だと、LanguageMonitor32は、JobIDと印刷設定の組み合わせをテーブル状に保持する。描画ドライバ39は、印刷データの生成に印刷設定が必要になると、JobIDをキーとしてLanguageMonitor32に印刷設定を問い合わせるgetする。このように、OS10によって印刷ジョブに一意のキーが振られ、そのキーを利用して情報を保持する仕組みをLanguageMonitor32が有する。このため、複数のアプリケーションが任意に複数の印刷ジョブを開始しても、プリンタドライバ30は印刷ジョブ毎に印刷設定を管理できる。LanguageMonitor32への設定及び問い合わせにSendRecvBidiDataFromPort関数が使用される。プリンタドライバ30がSendRecvBidiDataFromPortにてLanguageMonitor32を呼び出すことで、LanguageMonitor32を保存場所として使うことが可能となる。すなわちLanguageMonitor32とSendRecvBidiDataFromPort関数によりデータ保持部321が実現される。上記のように、LanguageMonitor32はメーカが開発しなくとも、標準のLanguageMonitor32がOS10と共に利用可能である。メーカが開発しない場合はそのLanguageMonitor32が動作する。メーカは決められたIFに合わせ、LanguageMonitor32を開発すれば、独自の機能を追加することができる。本実施形態では、SendRecvBidiDataFromPortというIFを利用することによりプリンタドライバ30等はLanguageMonitor32とのデータのやりとりが可能となる。UIドライバ38は、pActionに設定を意味する定数を設定し、pReqDataにJobIDを設定し、ppResDataに印刷設定が記憶されたアドレスへのポインタを設定する。LanguageMonitor32は、BIDIREQUESTDATA構造体の配列の要素の1つであるaDataにJobIDを格納し、BIDIRESPONSEDATA構造体の配列の要素の1つであるaDataに印刷設定へのポインタを格納する。これにより、図19のようにJobIDと印刷設定が対応づけられる。また、描画ドライバ39は、pActionに読み出しを意味する定数を設定し、pReqDataにJobIDを設定し、不図示の戻り値を指定する。これによりLanguageMonitor32は、ppReqDataに対応する印刷設定が記憶されたアドレスのポインタを戻り値に格納して描画ドライバ39に返す。このようにOS10の機能を利用することで、LanguageMonitor32におけるデータ保持部321のキーを印刷ジョブで重複しないJobIDとすることができる。<動作手順>図20は、RAWスプールのWindowsR系OSの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはGDI34とUIドライバ38、又は、GDI34と描画ドライバ39の間では、不図示の通信が行われているが省略している。GDI34からUIドライバ38へのメッセージはUI系のDDI関数で、描画ドライバ39へのメッセージは描画系DDI関数でそれぞれ通知される。この図20のS1までにUIドライバ38はユーザが設定した印刷設定を受け付けており、ユーザが印刷開始を操作するとアプリケーションがDEVMODEに格納された印刷設定を取得する。S1アプリケーションはまず、GDI34に印刷準備開始を指示する。具体的には、アプリケーションはCreateDC関数で印刷設定を引数にしてGDI34をコールする。S11GDI34はAPIに対応するDDIをコールすることで、描画ドライバ39に印刷設定を送出する。CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S2GDI34が印刷準備完了をアプリケーションに通知すると、アプリケーションはGDI34に印刷開始を指示する。具体的には、アプリケーションはStartDoc関数でDocINFOなどを引数にしてGDI34をコールする。S21GDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCPREをUIドライバ38に送出する。S22GDI34は描画ドライバ39に印刷開始を指示する。具体的にはDrvStartDoc関数を描画ドライバ39に送出する。OS10は、CreateDC関数により所定のタイミングでJobIDを生成している。GDI34はDrvStartDoc関数の引数にJobIDを設定するので、描画ドライバ39はJobIDを参照できるようになる。S23同様にGDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTをUIドライバ38に送出する。GDI34はこの関数の引数にJobIDを設定するので、UIドライバ38はJobIDを参照できるようになる。S231ここでUIドライバ38は、印刷設定に印刷開始指示後の印刷設定の変更を受け付ける設定があることを検出する。このため、UIドライバ38は、ポップアップ表示の処理を開始する。描画ドライバ39と直接通信できないので、GDI34にExtEscapeを送出する。S2311GDI34は描画ドライバ39にDrvEscapeを通知する。描画ドライバ39はGDI34を介して保持している印刷設定をUIドライバ38に送出する。S24ExtEscapeの処理によりUIドライバ38は、印刷設定を取得できたことになる。印刷設定に、印刷開始指示後に印刷設定を変更するための印刷ダイアログの表示指示が設定される場合、UIドライバ38は図1、2のような印刷ダイアログを表示し、ユーザによる印刷設定の変更を受け付ける。S232ユーザが印刷ダイアログを閉じることで、UIドライバ38はSendRecvBidiDataFromPortsetで、JobIDをキーとし、ユーザが変更した印刷設定をLanguageMonitor32に送出するはDOCUMENTEVENTを省略したことを意味する。これにより、LanguageMonitor32はJobIDと印刷設定を対応づけて保持することができる。この時、ユーザがダイアログをOK又はキャンセルどちらで閉じたのかという内容も送出される。S3GDI34が印刷開始完了をアプリケーションに通知すると、アプリケーションはページ単位の処理を繰り返す。まず、アプリケーションはGDI34に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーションはStartPageをGDI34に送出する。S31GDI34はDrvStartPageを描画ドライバ39に送出する。S311描画ドライバ39は、一番最初のDrvStartPageのDDIコールを受けた時のみ、保持していたJobIDをキーとしてSendRecvBidiDataFromPortgetでLanguageMonitor32に印刷設定を要求する。ここで、LanguageMonitor32には、S232でユーザがOK又はキャンセルのどちらで閉じたかの情報を保持している。描画ドライバ39は、OKでユーザが閉じていれば、印刷設定に基づき印刷データを生成する。キャンセルで閉じていれば、プリンタやFAX装置にデータを送信しないようにする。S4アプリケーション31は、描画ドライバ39から応答を取得すると、描画関数文書データをGDI34に送出する。S41GDI34は、描画関数文書データを描画ドライバ39に送出する。描画ドライバ39は印刷設定に従って文書データを印刷データに変換する。以降の手順は従来と同様なので省略する。このように描画ドライバ39はLanguageMonitor32から、JobIDにより一意に指定される印刷設定を取得することができる。すなわち、RAWスプールにおいて印刷開始後に印刷設定を変更しても、上書きされるようなおそれがない。図21は、EMFスプールのWindowsR系OSの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはGDI34とUIドライバ38、又は、GDI34と描画ドライバ39の間では、不図示の通信が行われているが省略している。この図21のS1までにUIドライバ38はユーザが設定した印刷設定を受け付けており、ユーザが印刷開始を操作するとアプリケーションがDEVMODEに格納された印刷設定を取得する。S1アプリケーションはまず、GDI34に印刷準備開始を指示する。具体的には、アプリケーションはCreateDC関数で印刷設定を引数にしてGDI34をコールする。S11GDI34はAPIに対応するDDIをコールすることで、描画ドライバ39に印刷設定を送出する。CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S2GDI34が印刷準備完了をアプリケーションに通知すると、アプリケーションはGDI34に印刷開始を指示する。具体的には、アプリケーションはStartDoc関数でDocINFOなどを引数にしてGDI34をコールする。S21GDI34はUIドライバ38に印刷開始を指示する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCをUIドライバ38に送出する。S22GDI34はUIドライバ38にJobIDを送出する。具体的にはDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTをUIドライバ38に送出する。GDI34はこの関数の引数にJobIDを設定するので、UIドライバ38はJobIDを参照できるようになる。この時点では描画ドライバ39はJobIDを取得していない。S221ここでUIドライバ38は、印刷設定に印刷開始指示後の印刷設定の変更を受け付ける設定があることを検出する。このため、UIドライバ38は、ポップアップ表示の処理を開始する。UIドライバ38は、デバイスコンテキストを引数として、GDI34に対しExtEscapeをコールする。S2211GDI34は、DrvEcapeのDDIコールを描画ドライバ39に送出することで、描画ドライバ39が保持している印刷設定を要求する。描画ドライバ39はGDI34を介して保持している印刷設定をUIドライバ38に送出する。S24ExtEscapeの処理によりUIドライバ38は、印刷設定を取得できたことになる。印刷設定に、印刷開始指示後に印刷設定を変更するための印刷ダイアログの表示指示が設定される場合、UIドライバ38はユーザによる印刷設定の変更を受け付ける。S222ユーザが印刷ダイアログを閉じることで、UIドライバ38はSendRecvBidiDataFromPortsetで、JobIDをキーとし、ユーザが変更した印刷設定をLanguageMonitor32に送出する。これにより、LanguageMonitor32はJobIDと印刷設定を対応づけて保持することができる。この時、ユーザがダイアログをOK又はキャンセルどちらで閉じたのかという内容も送出される。S3~S6について従来と同様なので省略する。ここまででアプリケーションプロセスでの印刷が終了する。この後、スプーラ35のプロセスで再度印刷処理がかかり、ここでEMFデータからRAWデータへ変換される。OS10はアプリケーションとGDI34の通信を監視して、所定のタイミングになると例えばStartPageの後、スプーラ35にプロセスを開始させる。S7スプーラ35は、プリントプロセッサ41に印刷準備開始を指示する。S71プリントプロセッサ41はGDI34に印刷準備開始を指示する。S711GDI34は描画ドライバ39に印刷設定を送出する。具体的には、CreateDCの引数でアプリーションがGDI34に渡した印刷設定が、DrvEnablePDEVの引数に格納され描画ドライバ39に通知される。この後、描画ドライバ39は、ジョブが終了するまでデバイスコンテキストが消去されるまで印刷設定を参照することができる。S712GDI34は描画ドライバ39に印刷開始を指示する。具体的にはDrvStartDoc関数を描画ドライバ39に送出する。OS10は、CreateDC関数により所定のタイミングでJobIDを生成している。GDI34はDrvStartDoc関数の引数にJobIDを設定するので、描画ドライバ39はJobIDを参照できるようになる。S72以降、プリントプロセッサ41はページ単位の処理を繰り返す。まず、プリントプロセッサ41はGDI34に新しいページの印刷データを受け入れるよう指示する。具体的には、プリントプロセッサ41はGdiStartPageEMFをGDI34に送出する。S721GDI34はDrvStartPageを描画ドライバ39に送出する。S7211描画ドライバ39は、一番最初のDrvStartPageのDDIコールを受けた時のみ、保持していたJobIDをキーとしてSendRecvBidiDataFromPortgetでLanguageMonitor32に印刷設定を要求する。ここで、LanguageMonitor32には、S222の印刷ダイアログをユーザがOK又はキャンセルのどちらで閉じたかの情報を保持している。描画ドライバ39は、OKでユーザが閉じていれば、印刷設定に基づき印刷データを生成する。キャンセルで閉じていれば、プリンタやFAXにデータを送信しないようにする。S722GDI34は、描画関数文書データを描画ドライバ39に送出する。描画ドライバ39は印刷設定に従って文書データを印刷データに変換する。S723GDI34は描画ドライバ39に1ページ分の書き込みが終了したことを通知する。具体的には、GDI34はDrvSendPageを描画ドライバ39に送出する。以降はページ単位の繰り返しとなる。すなわち、EMFスプールにおいて印刷開始後に印刷設定を変更しても、上書きされるようなおそれがない。なお、図20,21では、印刷のシーケンスがスプール形式によって異なるため、差異があるように見える。しかし、描画ドライバ39のDrvEnablePDEVDrvStartDocDrvStartPageDrvEscapeUIドライバ38のDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTLanguageMonitor32のSendRecvBidiDataFromPortsetSendRecvBidiDataFromPortgetの各関数内で、行っている処理は、RAWスプールでもEMFスプールでも全く同じ処理である。したがって、本実施形態の印刷設定の管理方法はスプール形式によらず、実現可能であり、複数のアプリケーションが作動する環境でも、印刷開始後にユーザが印刷設定を変更することを可能にできる。本実施例では、PointPrint環境においてLanguageMonitor32を利用した印刷設定の管理方法について説明する。図22は、PointPrint環境を備えた印刷システムの概略構成図の一例を示す。4台のクライアントPCがネットワークを介してサーバPCと接続されている。サーバPC110にはプリンタ200が接続されているが、プリンタ200はネットワークに接続されていてもよい。サーバPC110にはプリンタドライバ30が登録されており、サーバPC110が各クライアントPCにプリンタドライバ30をコピーして配布するので、ユーザはプリンタドライバ30を容易にインストールすることができる。なお、以降は、クライアントPC1がサーバPC110に接続し、PointPrintによりプリンタドライバAをインストールしたものとする。PointPrint環境のサーバサイドレンダリングでは、クライアントPCがユーザの印刷設定を受け付け、サーバPC110が描画処理を行うため、印刷設定などを共有することが困難である。これに対し、本実施例ではOS10が提供する印刷アーキテクチャの内部のLanguageMonitor32を利用してクライアントPCとサーバPC110が印刷設定を交換するので、サーバPC110はクライアントPCから印刷アーキテクチャ内の処理で印刷設定を取得できる。よって、ユーザは印刷開始後に印刷設定を変更しても、サーバPC110は変更後の印刷設定に基づき描画処理できる。図23は、PointPrint環境におけるLanguageMonitor32の位置づけを説明する図の一例である。LanguageMonitor32はWindowsR系OSの印刷アーキテクチャの中に組み込まれる一モジュールである。このため、PointPrintによりクライアントPC側がUIドライバ38の処理を、サーバPC側が描画ドライバ39の処理を受け持ったとしても、LanguageMonitor32はサーバPC側で1つだけ機能する。このため、クライアントPCのプリンタドライバ30とサーバPC110のプリンタドライバ30は1つのLanguageMonitor32にアクセスする。すなわち、クライアントPCのOS10とサーバPCのOS10は、クライアントPCのUIドライバ38がLanguageMonitor32にアクセスする場合、クライアントPCとサーバPC110の通信を確立する例えば、RPCRemoteProcedureCallを利用する。そして、UIドライバ38がクライアントPCのLanguageMonitor32にアクセスしているように見せる。このようにクライアントPCとサーバPC110が同じWindowsR系のOS10をインストールしているので、WindowsR系OSの印刷アーキテクチャのLanguageMonitor32を共通に利用できる。このため、メーカ独自で開発したモジュールなどで生じやすいアクセス権限や通信エラーなどが起こりにくい。また、同様の理由で、OS10との親和性も高い。なお、PointPrintでもスプール形式にはRAWスプールとEMFスプールがあるが、RAWスプールの場合、サーバサイドレンダリングが存在しない。RAWスプールはアプリケーションのプロセスなので、レンダリング場所が制限されるためである。その他の場合、RAWスプールのクライアントサイドレンダリング、EMFスプールのクライアントサイドレンダリング、及び、EMFスプールのサーバサイドレンダリング、のいずれの場合も、図23のようにLanguageMonitor32が利用される。図24は、PointPrint環境におけるJobIDについて説明する図の一例である。クライアントPCがRPCでサーバPC110と接続されている場合、クライアントPCからサーバPC110のプリンタに対してハンドルを取得すると、セッションが確立される。サーバPC110はセッションが確立されるとJobIDを生成し、クライアントPCに通知する。したがって、RAWスプールのクライアントサイドレンダリング、EMFスプールのクライアントサイドレンダリング、及び、EMFスプールのサーバサイドレンダリング、のいずれの場合もサーバPC110がJobIDを生成する。なお、JobIDの生成タイミングは、実施例1と同様である。図24では、クライアントPC1がアプリケーションAをクライアントPC2がアプリケーションA、BをクライアントPC3がアプリケーションCをそれぞれ実行している。各アプリケーションは任意のタイミングで印刷開始を指示する。印刷開始命令1:クライアントPC2アプリケーションA印刷開始命令2:クライアントPC1アプリケーションA印刷開始命令3:クライアントPC3アプリケーションC印刷開始命令4:クライアントPC2アプリケーションBサーバPC110のOS10は、印刷開始命令1~4に一意のJobID1~4を付与する。すなわち、1台のクライアントPCが単一のアプリケーションから印刷を開始しても、1台のクライアントPCが複数のアプリケーションから印刷を開始しても、1台のクライアントPCが単一のアプリケーションから複数回印刷を開始しても、サーバPC110は重複しないJobIDを付与する。実施例1と同様に、UIドライバ38は、クライアントPCがサーバPC110から取得したJobIDを、GDI34のDDIコールであるDrvStartDocの引数により受け取ることができる。描画ドライバ39はGDI34から送出されたDrvStartDocの引数でJobIDを受け取ることができる。図25は、PointPrint環境におけるRAWスプールの印刷手順を模式的に説明する図の一例である。PointPrint環境においてユーザがRAWスプールに設定するとサーバサイドレンダリングは設定できない、クライアントPCで描画処理が行われる。1.アプリケーションがGDI34を呼び出す。この時、サーバPC110がサーバにとって一意のJobIDを付与し、クライアントPCに返す。2.GDI34がプリンタドライバ30を呼び出す。3.プリンタドライバ30の描画ドライバ39はGDI34からDrvStartDocの引数によりJobIDを取得する。また、プリンタドライバ30のUIドライバ38はGDI34からDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTによりJobIDを取得する。UIドライバ38が印刷ダイアログを表示すると、ユーザは印刷設定を変更することができる。UIドライバ38は描画ドライバ39からDrvEscapeで取得した印刷設定を、LanguageMonitor32にSendRecvBidiDataFromPortsetする。その後、ページ単位の印刷が始まると、描画ドライバ39はLanguageMonitor32からSendRecvBidiDataFromPortgetで印刷設定を取得する。4.描画ドライバ39は必要であれば描画処理を行い、スプーラ35に印刷データを送出する。スプーラ35は印刷データRAWデータをスプールする。5.スプーラ35はRPCにより印刷データをサーバPC110に送信する。6.サーバPC110の処理に移り、サーバPC110のプリントプロセッサ41は印刷データをスプールする。7.スプーラはLanguageMonitor32に印刷データを送出する。8.LanguageMonitor32とポートモニタ33はプリンタに印刷データを送信する。この段階で、LanguageMonitor32は特に処理は行わない。このように、JobIDがサーバPC110にて生成される以外は、プリンタドライバ30がローカルで動作した場合と同様である。したがって、シーケンス図も図20と同じものになる。よって、LanguageMonitor32を利用したJobIDと印刷設定の管理は、PointPrint環境でRAWスプールした場合でも実現可能である。図26は、PointPrint環境におけるEMFスプールクライアントサイドレンダリングの印刷手順を模式的に説明する図の一例である。PointPrint環境においてユーザがEMFスプールに設定すると、ユーザはレンダリングサイドを選択できる。クライアントサイドレンダリングを選択すると、クライアントPCで描画処理が行われる。1.アプリケーションがGDI34を呼び出す。この時、サーバPC110がサーバにとって一意のJobIDを付与し、クライアントPCに返す。2.GDI34がプリンタドライバ30を呼び出す。プリンタドライバ30のUIドライバ38はGDI34からDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTによりJobIDを取得する。UIドライバ38が印刷ダイアログを表示すると、ユーザは印刷設定を変更することができる。UIドライバ38は描画ドライバ39からDrvEscapeで取得した印刷設定を、LanguageMonitor32にSendRecvBidiDataFromPortsetする。GDI34は文書データからEMFデータを生成する。3.スプーラ35は印刷データEMFデータをスプールする。4.プリントプロセッサ41はGDI34を呼び出す。5.GDI34はプリンタドライバ30を呼び出す。6.プリンタドライバ30の描画ドライバ39はGDI34からDrvStartDocの引数によりJobIDを取得する。また、ページ単位の印刷が始まると、描画ドライバ39はLanguageMonitor32からSendRecvBidiDataFromPortgetで印刷設定を取得する。プリンタドライバの描画ドライバ39はEMFデータからRAWデータを作成する。7.スプーラ35はRPCにより印刷データRAWデータをサーバPC110に送信する。8.サーバPC110の処理に移り、サーバPC110のプリントプロセッサ41は印刷データをスプールする。9.スプーラは印刷データをLanguageMonitor32に送出する。10.LanguageMonitor32とポートモニタ33はプリンタに印刷データを送信する。この段階で、LanguageMonitor32は特に処理は行わない。このように、EMFスプールにおいても、JobIDがサーバPC110にて生成される以外は、プリンタドライバ30がローカルで動作した場合と同様である。クライアントPCとサーバPC110とで処理する場所が別れたとしても、OS10の機能によりクライアントPCのプリンタドライバ30はLanguageMonitor32がクライアントPCにあるかサーバPC110にあるかに関係なくアクセスすることができる。また、印刷開始後にUIドライバ38の印刷ダイアログで変更された印刷設定を描画ドライバ39がLanguageMonitor32経由で取得することが可能である。したがって、シーケンス図も図21と同じものになる。よって、LanguageMonitor32を利用したJobIDと印刷設定の管理は、PointPrint環境のEMFスプールクライアントサイドレンダリングの場合でも実現可能である。図27は、PointPrint環境におけるEMFスプールサーバサイドレンダリングの印刷手順を模式的に説明する図の一例である。PointPrint環境においてユーザがEMFスプールに設定すると、ユーザはレンダリングサイドを選択できる。サーバサイドレンダリングを選択すると、サーバPC110で描画処理が行われる。1.アプリケーションがGDI34を呼び出す。この時、サーバPC110がサーバにとって一意のJobIDを付与し、クライアントPCに返す。2.GDI34がプリンタドライバ30を呼び出す。プリンタドライバ30のUIドライバ38はGDI34からDrvDocumentEventDOCUMENTEVENTSTARTDOCPOSTによりJobIDを取得する。UIドライバ38が印刷ダイアログを表示すると、ユーザは印刷設定を変更することができる。UIドライバ38は描画ドライバ39からDrvEscapeで取得した印刷設定を、LanguageMonitor32にSendRecvBidiDataFromPortsetする。GDI34は文書データからEMFデータを生成する。3.スプーラ35は印刷データEMFデータをスプールする。4.スプーラ35はRPCにより印刷データEMFデータをサーバPC110に送信する。5.サーバPC110の処理に移り、サーバPC110のプリントプロセッサ41はGDI34を呼び出す。6.GDI34はプリンタドライバを呼び出す。7.プリンタドライバ30の描画ドライバ39はGDI34からDrvStartDocの引数によりJobIDを取得する。また、ページ単位の印刷が始まると、描画ドライバ39はLanguageMonitor32からSendRecvBidiDataFromPortgetで印刷設定を取得する。プリンタドライバの描画ドライバ39はEMFデータからRAWデータを作成する。プリンタドライバは印刷データRAWデータをスプールする。8.スプーラ35はLanguageMonitor32に印刷データを送出する。9.LanguageMonitor32とポートモニタ33はプリンタに印刷データを送信する。この段階で、LanguageMonitor32は特に処理は行わない。このように、EMFスプールにおいても、JobIDがサーバPC110にて生成される以外は、プリンタドライバ30がローカルで動作した場合と同様である。クライアントPCとサーバPC110とで処理する場所が別れたとしても、OS10の機能によりプリンタドライバ30はLanguageMonitor32がクライアントPCにあるかサーバPC110にあるかに関係なくアクセスすることができる。また、印刷開始後にUIドライバ38の印刷ダイアログで変更された印刷設定を描画ドライバ39がLanguageMonitor32経由で取得することが可能である。したがって、シーケンス図も図21と同じものになる。よって、LanguageMonitor32を利用したJobIDと印刷設定の管理は、PointPrint環境のEMFスプールクライアントサイドレンダリングの場合でも実現可能である。"