ドライバを使わず印刷する

  • GDIを経由せず、プリントスプーラを直接呼び出して印刷
  • スプーラAPIを使う
  • 呼び出す順序
    1. OpenPrinter
      • プリンタ名を指定して、ハンドルを取得する
    2. StartDocPrinter
      • 印刷のために文書がスプールされたことを印刷スプーラに通知、っていうかプリントドキュメント名をセットするだけ
      • DOC_INFO_1構造体を渡す*1
      • docinfo.pDocName :ドキュメント名
      • docinfo.pOutputFile :プリンタに出すならNULL
      • docinfo.pDatatype :the type of data used to record the documentって意味不明。。。"RAW"を書いてる例もあったが、NULLでもちゃんと出る。謎
    3. StartPagePrinter
      • 指定されたプリンタ上でページが印刷されようとしていることをスプーラに通知
    4. WritePrinter
      • 指定されたプリンタにデータを書き込むよう印刷スプーラに通知
      • ここで書き出すデータを指定
    5. EndPagePrinter
      • 指定されたプリンタのページの終端と次のページの先頭を示します
    6. EndDocPrinter
      • 指定されたプリンタの印刷ジョブを終了
    7. ClosePrinter
      • 特定のプリンタオブジェクトをクローズ
  • 3〜5をページ単位に繰り返すのかな

参考 http://www.cisnet.or.jp/home/tsuneoka/win32tech/22.html
http://abfan.active.client.jp/023.html

ESC/Pでプリント

  • なんと文字コードは、SJISではなく、JISコードだった
    • なので、自分でSJIS→JIS90へのコード変換をやる必要あり
  • 漢字を打つ時は漢字開始(漢字モード設定)コマンドが必要
  • LF(0x0a、1行改行)はちゃんと改行して次行の先頭から印字される
  • CR(0x0d、印字復帰)だけだと、現在行の頭から重ね打ちになる
  • 先頭にプリンタの初期化コマンドを入れる

*1:DOC_INFO_2もあるがWindows95/98/Me用。NT以降ならDOC_INFO_1しか使えない