【Windows】Windowsプリントの調査

印刷プロセス
  1. アプリケーションがGDIを呼出し
    • RAWフォーマットの時はGDIは使わない
  2. GDIは、プリンタドライバに問合せ、プリンタの言語でジョブを作成
    • 設定によりEMF?、しかし下のURLを見るとWindows XP、2000、NT 4.0 のクライアントから送られる印刷ジョブのデータ型は EMF と書いてある。。。
  3. GDIがクライアント側スプーラにジョブを送信
  4. クライアント側スプーラは、RPCによりプリントサーバの印刷ルーターにジョブの受信を依頼
  5. 印刷ルーターは、クライアント側のRPP(リモートプリントプロバイダ)よりジョブを受信
  6. 印刷ルーターは、LPP(ローカルプリントプロバイダ)にジョブを渡す
  7. LPPはジョブをスプールファイルに書き込む
    • 設定で、スプール経由、直接プリンタへ送信、が選べる
  8. LPPはプリントプロセッサと区切りページプロセッサを呼出し、ジョブに必要な変更を加える
    • 区切りページはわかるが、プリントプロセッサが行なう必要な変更って何だ?
  9. ポートモニタ(標準ポートモニタ:SPM:Standard TCP/IP Port Monitor)がジョブをスプールより取り出しプリンタへ転送
  10. プリンタが、ジョブを解釈してプリント

参考http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/Default.asp?url/resources/documentation/windowsserv/2003/standard/proddocs/ja-jp/sag_PRINTconcepts_printing_process.asp

印刷ジョブのフォーマット
  • EMF(Enhanced Metafile)
    • Windows2000で作成される印刷ジョブの標準フォーマット
    • EMFファイルはGDIによって作成される
    • EMFを処理するスプーラを持つプリンタ、ってのがあるのか??
  • RAW
    • スプーラによって変更されずに、直接プリンタに送信される
      • えっ、スプーラは変更するものなの?
  • TEXT
    • データがANSIテキスト
    • プリンタのフォントを使って印刷される
  • PSCRIPT1
  • 普通はEMFかRAWで、どちらかをプリンタのプロパティで選べたりする
    • 正常に出ない場合にEMFに変えてください、というFAQが多いので、デフォルトはRAWが普通なのかもしれない
    • EMFのほうがPCでの印刷処理が早く終わるみたい、PCの処理負荷が軽くなる
    • しかし、EMFでは印刷できないアプリケーションがあるみたい
スプールファイルの場所
  • コントロールパネル>プリンタとFAXで、ファイル>サーバのプロパティを開く
  • 詳細設定タブの、スプールフォルダ というところでフォルダの場所が設定されている
C:\WINDOWS\System32\spool\PRINTERS
コマンドで共用プリンタに接続
net use LPT1: \\プリントサーバ名\プリンタ名
切離しは↓
net use LPT1: /delete
  • 事前にポートをLPT1にしたローカルプリンタを作成しておく必要がある
  • その際、機種も決めてドライバをインストールしておかなくてはいけない
  • LPT1〜LPT3までしかない。LPT4とか作ろうとしたけどダメ。適当な名前なら作れるが、プリンタポートではなくローカルポートになってしまい、これには上のコマンドで接続できない、エラーになる。
プリンタ共用時のドライバダウンロード
  • Windows 2000Windows NT 4.0 のクライアントは、接続時にプリンタ ドライバとプリンタ構成を検査
  • ドライバが古い場合、新しいドライバが自動的にダウンロードされる

共用プリンタへの接続を動的にできないか

スクリプトで共用プリンタに接続
  • Prncnfg.vbs で出来るみたい
印刷先をファイルにし、lprでプリントする
  • ポートをFILE:(ファイルに出力)にしてローカルプリンタを作成
    • プリンタ機種は、あとで出力するプリンタを選択する。そのドライバを使ってファイルを作るので。
  • そのプリンタ宛に印刷するとファイルの保存場所を聞くダイアログが開く
  • 出来たファイルをlprでプリント
lpr -S プリントサーバ名 -P プリンタ名 -o l ファイル名
AddPrinterConnection
  • Win32API
  • 指定されたプリンタへの現在のユーザーの接続を追加
  • 引数はプリンタ名だけ
  • 削除はDeletePrinterConnection
SHInvokePrinterCommand
  • PRINTACTION_NETINSTALL
    • The network printer specified by the name in lpBuf1 will be installed. lpBuf2 is ignored.
  • Windows Shell Functions
  • 削除が無いみたい