プロが教える店舗&オフィスのセキュリティ対策術

只今、VB6のDataReportを使用して500ページほど
印刷したいのですが100ページほどしか印刷されません。

原因は印刷が完了する前にDataReportの解放を行っているためです。

DataReportの解放前に数秒プログラムを停止させる方法があるのですが
できればPrintreportメソッドで出力が完了したかの判断を行いたいです。

それに近い質問があり以下のように実行したのですがうまくいきませんでした。

具体的な解決方法があればとてもありがたいです。

【プログラムロジック.vbs】
'起動プロセスのオープン(状態の取得準備)
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 = Control.PrintReport
hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess)
ret = WaitForSingleObject(hProcess, INFINITE)
ret = CloseHandle(hProcess)

上記方法でテストしたのですが
「IDProcess」には「1」が返ります。
「hProcess」には「0」が返ります。
スプールにJOBがたまるまで「WaitForSingleObject」で
WAITされると思ったのですがとくに待ちになりませんでした。

環境はWindowsXP、Windows2003サーバです。

よろしくお願いします。

A 回答 (2件)

解放前に以下の記述をします。


'非同期操作終了待
Do While drt.AsyncCount > 0
DoEvents
Loop
sleep入れたほうがいいかも?
    • good
    • 0

DataReportのPrintReportは クッキーを返すだけでProcesハンドルを返すわけではないと思います



アウトプロセスで起動されてるなら EnumProcessesなどでプロセスIDを取得してEnumProcessModulesでモジュールハンドルを取得
GetModuleFileNameExでファイル名を取得して捜し求めるプロセスハンドルを特定
といった手順が必要でしょう … たぶんインプロセスで動いてると思うけど

それより DataReportのErrorイベントでエラーになっている原因を探ったほうがいいように思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!