VB6 OpenPrinterのエラー
OS:WindowsXP SP3 言語:VB6 SP6
現在、指定されたプリンタのジョブを取得して、全てジョブを一時停止にするプログラムを作っています。
下記コードはタイマーイベントで実行されるコードなのですが、、、
「lngRet = OpenPrinter(mPrinterName, hPrinter, ByVal 0&)」の部分で、
アプリケーションエラー(※添付画像参照)が発生してしまいます。
最初のうちは発生しませんが、数秒後にエラーになります。(タイマー間隔は0.5秒に設定)
内容をご存知の方がいましたら教えていただけないでしょうか?
宜しくお願い致します。
-------------------------------------------------------------
Dim lngRet As Long
Dim i As Integer
Dim intRow As Integer
Dim lngTypeLen As Long
Dim hPrinter As Long
Dim Level As Long
Dim bytJob() As Byte
Dim dwNeeded As Long
Dim dwReturned As Long
Dim lngJobID() As Long
Dim udtJobInfo1() As JOB_INFO_1
Dim ftDate As FILETIME
Dim ltDate As FILETIME
Dim stDate As SYSTEMTIME
Dim udtPrinterDefaults As PRINTER_DEFAULTS
'初期化
Call PgdGrid.RemoveItems(0, PgdGrid.Items)
PgdGrid.Enabled = False
Erase lngJobID
'プリンタアクセス権
udtPrinterDefaults.DesiredAccess = PRINTER_ALL_ACCESS
'プリンタをオープンし、プリンタのハンドルを取得
↓エラーになる**********************************
lngRet = OpenPrinter(mPrinterName, hPrinter, ByVal 0&)
↑エラーになる**********************************
'まずEnumJobsを実行し、必要なメモリサイズ(バッファのバイト数)を調べる
lngRet = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 1&, ByVal 0&, 0&, dwNeeded, dwReturned)
If dwNeeded = 0& Then
Call ClosePrinter(hPrinter)
Exit Sub
End If
'配列初期化
ReDim bytJob(dwNeeded - 1)
'実際のデータを取得するために関数を実行
lngRet = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, bytJob(0), dwNeeded, dwNeeded, dwReturned)
'配列初期化
ReDim udtJobInfo1(dwReturned - 1)
ReDim lngJobID(dwReturned - 1)
For i = 0 To dwReturned - 1
Call MoveMemory(udtJobInfo1(i), bytJob(Len(udtJobInfo1(0)) * i), Len(udtJobInfo1(0)))
lngJobID(i) = udtJobInfo1(i).JobId
lngRet = OpenPrinter(mPrinterName, hPrinter, udtPrinterDefaults)
'ジョブの状態を一時停止にする
If (udtJobInfo1(i).Status And JOB_STATUS_PAUSED) Or (udtJobInfo1(i).Priority = 2) Then
'一時停止 or 本PGで既に設定したものは状態を変えない
Else
'優先順位を変える(フラグ)
udtJobInfo1(i).Priority = 2
lngRet = SetJob(hPrinter, lngJobID(i), 1, ByVal udtJobInfo1(i), JOB_CONTROL_PAUSE)
If lngRet = 0 Then
'エラー
MsgBox GetLastErrorMessage(GetLastError)
End If
'一時停止にする
lngRet = SetJob(hPrinter, lngJobID(i), 0&, 0&, JOB_CONTROL_PAUSE)
If lngRet = 0 Then
'エラー
MsgBox GetLastErrorMessage(GetLastError)
End If
End If
'プリンタをクローズ
Call ClosePrinter(hPrinter)
Next i
-------------------------------------------------------------
お礼
ありがとうございます。 EXEにして実行すると問題なく指定したプリンタから出力されるようです。 動作テスト中の段階でうまく切り替わらなくて違うプリンタから出たんで、ずーっと悩んでました。