VB6 OpenPrinterのエラー

このQ&Aのポイント
  • VB6 OpenPrinterのエラーについて質問しています。
  • 指定されたプリンタのジョブを一時停止するプログラムを作っているが、OpenPrinter関数の箇所でエラーが発生している。
  • エラーの内容がわからず、解決方法を知りたい。
回答を見る
  • ベストアンサー

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 -------------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.2

部分的なのでアルゴリズムが掴めないのですが、通常なら例えば Dim objPrinter As Printer For Each objPrinter In Printers mPrinterName = objPrinter.DeviceName ・・・ lngRet = OpenPrinter(mPrinterName, hPrinter, udtPrinterDefaults) ・・・ next のような感じになると思うのですが。 すみません、これ以上は判りません。

daisanaja
質問者

お礼

ありがとうございます。 こちらでまとめてから再度質問したいと思います。

その他の回答 (1)

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

示されたプログラムが一部なのか部分的なのか判りませんが、示された範囲だけで考えると、「mPrinterName」にプリンタ名が設定されているのでしょうか。

daisanaja
質問者

補足

部分的ですみません、mPrinterName にはプリンタ名が設定されています。

関連するQ&A

  • アクセスでテキストを開く

    アクセスでパスを指定して、特定のテキストファイルを開く方法を教えていただけますか? いかのモジュールを見つけたのですが、どこに、動かないか… フルパスを入れればよいか分かりません。 どうぞ宜しくお願いします。 *********************************************************************************************** Private Declare Function ShellExecute Lib "SHELL32.DLL" Alias "ShellExecuteA" (ByVal hwnd As Long, _ ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub コマンド0_Click() Dim strFilePath As String Dim lngRet As Long Const SW_SHOWNORMAL = 1 strFilePath = Me.txt_Path 'WinAPIを使って関連付けられたアプリケーションを起動 lngRet = ShellExecute(Application.hWndAccessApp, "OPEN", _ strFilePath, vbNullString, CurDir(), SW_SHOWNORMAL) If lngRet <= 32 Then '返り値が 32 以下の場合はエラー MsgBox "ファイルを開けません!", vbOKOnly + vbExclamation End If End Sub ***********************************************************************************************

  • VB.NETでXMLの読み込みを行うと例外エラーが出てしまい大変困って

    VB.NETでXMLの読み込みを行うと例外エラーが出てしまい大変困っています。どなたかお願いします。 Protected Sub Button4_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button4.Click Dim FILENAME As String FILENAME = "C:\\TEST\" If i = 1 Then FILENAME = FILENAME & "AAA\111.xml" Call testmethod(FILENAME) ElseIf i = 2 Then FILENAME = FILENAME & "BBB\222.xml" Call testmethod(FILENAME) End If End Sub Private Sub testmethod(ByVal FILENAME) If File.Exists(FILENAME) Then Dim xlr As XmlTextReader xlr = New XmlTextReader(FILENAME) While xlr.Read() Select Case xlr.LocalName Case "Personal" TextBox1.Text = xlr.ReadString Case "LastUpdate" Label1.Text = xlr.ReadString End Select End While xlr.Close() End If End Sub こんな感じでコードを書いているのですがWhile xlr.Read()のところで例外エラーが出てしまいます。 原因が全然つかめず困っています。 New XmlTextReader(FILENAME)のFILENAMEを変数でなく直接パスを書くとうまくいくのですが変数にするとなぜかハンドリングできなくなります。 どなたかご解説お願いします。

  • VB6のコードをVB.NETに移したいのですが

    WEBで見つけたVB6のサンプルコードをVB.NET用に書き直して いるのですが、なんとか波線のエラーはなくなったものの 実行すると、思った結果が得られません。 正しい訂正方法を教えて頂きたいです。 サンプルコードは下記のサイトにありました。 http://vbnet.mvps.org/index.html?code/internet/findfirstcacheentry.htm インターネットキャッシュに関するものです。 文字数の関係で全部は書けないのですが、現在は↓のようになっています。 その他の訂正箇所は 全部のAs Any を As Objectに変更していて、 ComboBoxのアイテムに数値が設定できないようなので、 Select Caseで判断するようにしています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim numEntries As Long Dim cacheType As Long Select Case ComboBox1.SelectedIndex Case Is = 0 cacheType = &H1S Case Is = 1 cacheType = &H8S Case Is = 2 cacheType = &H10S Case Is = 3 cacheType = &H20S Case Is = 4 cacheType = &H40S Case Is = 5 cacheType = &H10000 Case Is = 6 cacheType = &H100000 Case Is = 7 cacheType = &H200000 Case Is = 8 cacheType = URLCACHE_FIND_DEFAULT_FILTER End Select Label1.Text = "Working ..." Label1.Refresh() ListBox1.Items.Clear() ListBox1.Visible = False numEntries = GetCacheURLList(cacheType) ListBox1.Visible = True Label1.Text = VB6.Format(numEntries, "###,###,###,##0") & "files found" End Sub Private Function GetCacheURLList(ByRef cacheType As Long) As Long Dim ICEI As INTERNET_CACHE_ENTRY_INFO Dim hFile As Long Dim cachefile As String Dim nCount As Long Dim dwBuffer As Long Dim pntrICE As Long dwBuffer = 0 hFile = FindFirstUrlCacheEntry(vbNullString, 0, dwBuffer) If (hFile = ERROR_CACHE_FIND_FAIL) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) If pntrICE Then CopyMemory(pntrICE, dwBuffer, 4) hFile = FindFirstUrlCacheEntry(vbNullString, pntrICE, dwBuffer) If hFile <> ERROR_CACHE_FIND_FAIL Then Do CopyMemory(ICEI, pntrICE, Len(ICEI)) If (ICEI.CacheEntryType And cacheType) Then cachefile = GetStrFromPtrA(ICEI.lpszSourceUrlName) ListBox1.Items.Add(cachefile) nCount = nCount + 1 End If Call LocalFree(pntrICE) dwBuffer = 0 Call FindNextUrlCacheEntry(hFile, 0, dwBuffer) pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) CopyMemory(pntrICE, dwBuffer, 4) Loop While FindNextUrlCacheEntry(hFile, pntrICE, dwBuffer) End If End If End If Call LocalFree(pntrICE) Call FindCloseUrlCache(hFile) GetCacheURLList = nCount End Function どうしてもここから分からないので、お助けいただきたいです。 よろしくお願いいたします。

  • VB6 二重起動確実防止について

    VB6 SP5にて2重起動確実な防止処理をいれようとCreateMutex 関数を使用しようと思っています。 CreateMutex 関数を埋め込んでEXEを実行すると 実際に対象となるプログラムが起動しているにも関わらず起動してしまいます。 何がいけないのか?検討がつかず困っています。 下記がプログラムになります。 何かわかりましたらご回答の程、よろしくお願い致します。 ***Win32API**************** Option Explicit ' CreateMutex 関数 Private Declare Function CreateMutex Lib "KERNEL32.DLL" Alias "CreateMutexA" ( _ ByRef lpMutexAttributes As Long, _ ByVal bInitialOwner As Long, _ ByVal lpName As String _ ) As Long ' CloseHandle 関数 Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _ ByVal hObject As Long _ ) As Long ************************************ SUB MAIN********************************* Public Sub Main() Dim hMutex As Long hMutex = CreateMutex(ByVal 0&, 0&, App.Title) On Error GoTo Err_Main If Err.LastDllError = 0 Then Dim cForm As Form1 Set cForm = New Form1 Call cForm.Show(vbModal) End If Err_Main: If hMutex <> 0 Then Call CloseHandle(hMutex) End If End Sub ************************************************

  • VB2008で0ページの印刷ジョブを削除したい

    プリンターの印刷ジョブを確認すると、N/Aとなっている印刷ジョブが存在します。 実際には0ページなのですが、必要があって保留状態でスプールに蓄積しています。 これを、VBのPrintSystemJobInfoを使ってキャンセルできないかと考えたのですが 指定のプリンターにある0ページの印刷ジョブをどうやってキャンセルしていいかわかりません。 Public Property JobSize As Integer '使用 Dim instance As PrintSystemJobInfo Dim value As Integer value = instance.JobSize if value = 0 then instance.cancel end if とやればできそうなのですが、プリンタ内にある全てのジョブで やるには、どのようにループさせればいいのでしょうか?

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • Excel VBA 一定の数値以下で音を鳴らす

    一つのセル内の数値(VBAにより、1秒ごとに更新される流動的な数値です)において、-2以下になるとすぐにBEEP音が鳴る設定をしたいのですが、何故か1分ごとにしか鳴りません。 今のモジュールは、標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Sheet1に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Range("Q6") < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub と入力しています。 改善方法をどうかご教授願います。

  • VB 2008: Do Whie...Loop文について

    Function FileGetChar(ByVal f As String, ByVal p As Integer) As String   Dim i As Integer = 1   Dim j As Integer = 0   Dim l As Integer   Dim n As Integer = FreeFile()   Dim c As Char   If File.Exists(f) Then     FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)     l = FileLen(f)     Do While (i + j <= l)       FileGet(n, c, i + j)       j = j - (Math.Abs(Asc(c)) > 255)       i = i + 1       If i > p Then         Exit Do       Else         c = ""       End If     Loop     FileClose(n)   End If   Return c End Function [イミディエイトウインドウ] ? FileGetChar("D:\Temp\Test.txt",1) "1" ? FileGetChar("D:\Temp\Test.txt",2) "2" と、一応は動作しています。 l------->ファイル長 i+j----->読み込みのカレントポジション p------->読み込み指示ポジション 今、悩んでいるのはDo...Loop文中のIf Else End If の追放。 何か妙手があれば教えて頂きたい。

  • 配列のセットの仕方

    度々質問してすいません。 英文の単語を抽出して頻度順に並べるプログラムをVBで作りたいと思っております。下記URLのVB版です。 (http://gamp.c.u-tokyo.ac.jp/archive/perl.htm) 以下が作成したソースです。これとQuickSortのソース(http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm) を繋げて終わりたいと思うのですが、 どうつなげたらいいのかわかりません。 アドバイスをお願いいたします。 Private Sub Command1_Click() Dim strTarget As String Dim strResult As String Dim cha As String Dim chaList() As String Dim word As String Dim wordList() As Long Dim i As Long, j As Long Dim EndFlg As String strTarget = Me.Text1.Text i = 0 EndFlg = "" Do Until EndFlg = "END" i = i + 1 cha = Mid(strTarget, i, 1) If cha <> "" Then ReDim Preserve chaList(i) chaList(i - 1) = cha Else EndFlg = "END" End If Loop For i = 0 To UBound(chaList) - 1 If chaList(i) = "." Then chaList(i) = " " End If Next Text2 = "" For i = 0 To UBound(chaList) - 1 Text2 = Text2 & chaList(i) Next Text3 = "" word = "" For i = 0 To UBound(chaList) - 1 If chaList(i) = " " Then If i = 0 Then Else If chaList(i - 1) = " " Then Else Text3 = Text3 & Chr(13) & Chr(10) & word word = "" End If End If Else word = word & chaList(i) End If Next If word <> "" Then Text3 = Text3 & Chr(13) & Chr(10) & word End If

  • セルの内容更新時に実行される処理ができない

    以下のように関数を設定し、実行してみたのですがCall CommonModule.testの部分で 実行時エラー '424': オブジェクトが必要です。 と表示され関数が実行されません。 初心者なので知識が浅く、初歩的なミスかもしれませんがご教示いただければ幸いです。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range) If target.Count = 1 Then Dim column As Integer Dim row As Integer column = target.column row = target.row If row >= 3 Then If ((column - 3) Mod 5) = 2 And column > 3 Then Call CommonModule.test 'エラー '424' オブジェクトが必要です。 End If End If End If End Sub Function test() MsgBox "test" End Function