- ベストアンサー
プリンタの状態を知る方法
只今、VB6のDataReportを使って帳票を作成しています。1つの雛型を使って、 複数のレポートを連続印刷しようとしていますが、DataReportとFormが非同期で あるため、DataReportがまだ帳票をプリンタに吐き出し終わっていないうちに、次の帳票を作ろうとしてしまい、エラーが出てしまいます。 色々調べて、MoveMemoryなるAPIを使ってプリンタの状態(印刷中、とかスプール中とか)を取得しようとしていますが、それもエラーがでてしまいます。 どうしたら、上手にプリンタの状態を知ることが出来るでしょうか? もしくは、非同期で動いているもの同士の同期を取るような方法がありましたら ぜひ教えてください。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは VBが実行させたモジュールと自分を同期させる方法がWin32APIでありますので 参考にして下さい。 .bas '起動プロセスのオープン(状態の取得準備) Public Declare Function OpenProcess Lib "KERNEL32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long '起動プロセスとのシンクロ(待機する) Public Declare Function WaitForSingleObject Lib "KERNEL32" _ (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '起動プロセスのクローズ(終了) Public Declare Function CloseHandle Lib "KERNEL32" _ (ByVal hObject As Long) As Long '起動プロセスが実行中か調べる(状態の取得) Public Declare Function GetExitCodeProcess Lib "KERNEL32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Public Const SYNCHRONIZE = &H100000 Public Const INFINITE = &HFFFF .frm Dim IDProcess As Long Dim hProcess As Long Dim ret As Long IDProcess = 起動プロセス hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess) ret = WaitForSingleObject(hProcess, INFINITE) ret = CloseHandle(hProcess) 起動プロセスをControl.PrintReportで試してください。
その他の回答 (3)
- ats8181oyaji
- ベストアンサー率38% (94/244)
No.3の補足についての回答です。 MSDNのヘルプでPrintReportメソッドを調べたら 最後の行に "PrintReport メソッドは、非同期の操作を実行します。PrintReport メソッドは、非同期の操作を示す "クッキー" の識別子を返します。" とあります。 私はやったことが無いので一度試してください。 よろしく。
お礼
どうもありがとうございます! ヘルプで調べて頂いたんですね。 本当にありがたいです。 是非試してみようと思います!
- sienna
- ベストアンサー率35% (51/145)
DataReportは使用したことが無いのですが 要するに印刷処理中に再度印刷ボタンをクリックされてしまう事が 問題なのではないですか? 印刷が終了するまで印刷ボタン等を押せなくしたり 雛型を増やしてはダメですか?
補足
雛型を作るとしたら、400個ほど作らないといけないので、それはちょっと避けたいところなのです。 再印刷についてですが、『ボタンを押す』という形ではなくて、前の印刷の続きで印刷されてしまうので、ボタンでの制御は出来ないのです…。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 どういうエラーが出るのかわからないので、何とも言えませんが、とりあえずプリンタの印刷ジョブを列挙するサンプルのURLを紹介します。 このvbvbvb.comにはたくさんサンプルがあるので探してみてはどうでしょうか。 では。
補足
早速のお返事、ありがとうございます。 vbvbvb.comを拝見させて頂いたのですが、同じような処理をしても、どうもエラーが出てきてしまいます。 エラーの内容は「メモリが"read"になることはありませんでした」というものです。 どうやらMOVEMEMORYの箇所でエラーが発生するようです。 どうしたら出来るんでしょうか…。 どうかアドバイスよろしくお願いします。 ちなみにOSはWin2000です。
補足
アドバイス、どうもありがとうございます! 起動プロセスについてなのですが、DataReportでも起動プロセスは得られるのでしょうか?