WindowsAPIでプリンタを制御して印刷する方法は他にもあって、AddJobで印刷ジョブを追加するという方法もある。
AddJob 関数 (Winspool. h) - Win32 apps | Microsoft Docs
まず、
ローカルプリンタ、というか、物理プリンタを、既定のプリンタにしておく。
オフラインでもいけるっぽい。
(Microsoft Print to PDFなど、仮想のプリンタでは、なんか最終的に失敗する。)
AddJob.cppは、
GetDefaultPrinterで既定のプリンタ名を取得し、OpenPrinterで既定のプリンタハンドルを取得し、AddJobで既定のプリンタに印刷ジョブを追加(aji1が追加した印刷ジョブ情報)し、MessageBoxでいったん処理を止める。
AddJobの戻り値をintで受けてるのは、
c++ - AddJob + SetPrinter: is it possible to set dmCopies and get effect? - Stack Overflow
このリンクの場合は、AddJobじゃなくてGetJobの例だが、戻り値に122が来ることがあったんかな。
やっぱ122はERROR_INSUFFICIENT_BUFFER。
GetMessageと同じで、BOOLだけど、-1が来ますみたいな。
BOOLにしても、別に問題は無いが、戻り値にGetLastErrorのエラーコード返ってくるんかな。
昔の名残かな。
ここに置いて、コマンドプロンプトから実行。
メッセージボックスで止める。
タスクトレイ見たら、1個保留らしい。
右クリックでこれが出るので、このプリンタを選択してジョブを見る。
こんな感じでジョブが追加されてる。
(プリンタはオフラインだが、ジョブの追加はオフラインでも成功するみたい。)
ジョブの追加が確認できたので、さっきのMessageBoxのOKを押す。
終わった。
ジョブはすぐ消えるので元に戻っちゃう。
Sample/winapi/AddJob/AddJob/src/AddJob at master · bg1bgst333/Sample · GitHub