AddJob

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が来ることがあったんかな。

Win32エラーコード一覧

やっぱ122はERROR_INSUFFICIENT_BUFFER。
GetMessageと同じで、BOOLだけど、-1が来ますみたいな。
BOOLにしても、別に問題は無いが、戻り値にGetLastErrorのエラーコード返ってくるんかな。
昔の名残かな。

ここに置いて、コマンドプロンプトから実行。
ここに置いて、コマンドプロンプトから実行。

ここに置いて、コマンドプロンプトから実行。

メッセージボックスで止める
メッセージボックスで止める

メッセージボックスで止める。

タスクトレイ見たら、1個保留らしい。
タスクトレイ見たら、1個保留らしい。

タスクトレイ見たら、1個保留らしい。

右クリックでこれが出るので、このプリンタを選択してジョブを見る
右クリックでこれが出るので、このプリンタを選択してジョブを見る

右クリックでこれが出るので、このプリンタを選択してジョブを見る。

こんな感じでジョブが追加されてる
こんな感じでジョブが追加されてる

こんな感じでジョブが追加されてる。
(プリンタはオフラインだが、ジョブの追加はオフラインでも成功するみたい。)

ジョブの追加が確認できたので、さっきのMessageBoxのOKを押す。

終わった
終わった

終わった。

ジョブはすぐ消えるので元に戻っちゃう
ジョブはすぐ消えるので元に戻っちゃう

ジョブはすぐ消えるので元に戻っちゃう。

Sample/winapi/AddJob/AddJob/src/AddJob at master · bg1bgst333/Sample · GitHub