エンド ユーザ様より、問い合わせがありました。「オタクのところで作ってるポートモニタね、WMI の WIN32_PRINTERS で問い合わせると PrinterStatus が Unknown になるんやけど、なんでやの?Standard TCP/IP やったら、そんなんならへんで。」
はぁ、まぁ、いろいろ、追加してるからなぁ。。。と、「なぜ」を探すこと、1日半。プログラム コードを見ても、“プリンタの”ステータスを設定しているようなところはない。リファレンスにあたっても、ポートモニタが“プリンタの”ステータスを設定しろなんてことは書いていない。
かる~く、サンプル コードを書いて、スプーラが提供しているステータスと比べると、スプーラ上で「プリンタに送信中」となったときに、PrinterStatus が Unknown になることがわかった。「送信中」に該当するコードは、PrinterStatus にはない。おそらく、対応していないから、「わからない」と返してくるのだろう。
というところまではわかったけど、じゃぁ、なんで対応していないのさ?さっぱりわからなくなったところで、浮かんだ。「そうだ。今月でサポート インシデントの有効期間が切れるじゃないか。どうせなら、使ってしまおう。」
ってことで、電話。「うちで作ってるポートモニタと、STD TCP/IP で PrinterStatus が違うのだけど、この PrinterStatus は、どこを見て出してるの?」
一時受付(インシデントの確認)から、二時受付(問題の切り分け)に回り、担当者からの call back があるまで1時間。ちょっと遅いと思う。
早速、疑問をぶつける。
マ:「SetJob でステータスを設定して…」
え???「SetJob」ですって?PrinterStatus を、SetJob で設定するの??そりゃ、気づかないわ。
で、探すと、設定している。「JOB_CONTROL_SENT_TO_PRINTER」って。ほうほう。スプーラが報告する状態と一緒やね。ほんで、これの時に Unknown になるのは、“仕様”ですね。だって、PrinterStatus にはそんな状態定義されてへんモン。「内部で保持する状態に対応する状態が全て定義されているわけではない。」ってことがわかったので、これでいいか。
マ:「一つ気になりますのは、私どもの方でよくお受けするご要望では、スプーラ サービスが表示している状態と同じものが表示したいというものがございまして。。。」
うん、そうだろうね。でも、うちのエンド ユーザ様は、たぶん、印刷ができる状態かどうかがわかればいいのだと思う。エラーであるということがわかれば、それでいいと思う。
マ:「スプーラと同じ状態は、GetPrinter 関数から、PRINTER_INFO_6 構造体の dwStatus で取れるのですが、これが WIN32_PRINTER.PrinterState の方に入ってきます。KB196805で、PrintMon.exe というツールを紹介していますが、こちらの方にコード例もございますので、ご利用ください。」
え?PrinterState ですか?これ、obsolute って書いてあるですよ?まあ、いいか。
マ:「もし、この電話の内容だけでよろしければ、インシデントは一端キャンセルということにして…」
え~!!そんなこと、いっちゃうの?いってくれちゃうの?
でもね、今月末で期限切れるから、いいよ。でも、説明するのに文書があった方がいいから、メールちょうだい。インシデント消費でかまわないから。ありがとうね。またよろしくね。
ってことで、あっという間に解決してしまったのでした。
その後の追加調査で、STD TCP/IP ポートは、UNIX の LP デーモンと互換性があるらしいことが判明。LP デーモンに、「プリンタに送信中」というステータスがないから、STD TCP/IP も、それを出さないのかな?
投稿日時 : 2008年9月23日 11:08