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

プリンタの印刷ジョブを削除したい。

現在、VB.NET(Visual Studio 2008)で開発を行っています。
SetPrinter関数を使用して、印刷ジョブを全て削除したいのですがSetPrinterに失敗してしまいます。
GetLastErrorの戻り値は「5」でアクセス拒否のようです。
SetPrinterの前にOpenPrinterは成功しており、プリンタの印刷ジョブの情報は取得できています。

なお、同環境でVB6.0で同様のプログラムを作成し実行したところジョブの削除ができました。


類似した現象・解決方法等ご存知でしたら教えてください。

開発環境はWindowsXP、Visual Studio 2008です。


以下、ソースの抜粋です。

'宣言
Private Const DEF_INIT_BUFFER_PERFORM As Integer = 100
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const PRINTER_ACCESS_ADMINISTER = &H4
Public Const PRINTER_ACCESS_USE = &H8
Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

Public Structure PRINTER_DEFAULTS
Public pDatatype As IntPtr
Public pDevMode As IntPtr
Public DesiredAccess As Integer
End Structure

<DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function OpenPrinter( _
ByVal pPrinterName As String, _
ByRef hPrinter As IntPtr, _
ByVal pDefault As PRINTER_DEFAULTS _
) As Boolean
End Function

<DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function SetPrinter( _
ByVal hPrinter As IntPtr, _
ByVal Level As Long, _
ByVal pDefault As IntPtr, _
ByVal Command As Long _
) As Boolean
End Function

'実行部
Dim pd As New PRINTER_DEFAULTS
pd.DesiredAccess = PRINTER_ALL_ACCESS

Dim printerHandle As IntPtr
Dim ret As Boolean = OpenPrinter("プリンタ名", printerHandle, pd)

Dim err As Integer = Marshal.GetLastWin32Error()

'Falseが返る
ret = SetPrinter(printerHandle, CLng(0), IntPtr.Zero, CLng(3))
'5が返る
err = Marshal.GetLastWin32Error()

A 回答 (2件)

投稿されたコードを見た限りでは。


SetPrinter の宣言が間違っています。
Long 型の変数が使用されている。
その他の部分でも変換忘れがないか確認され、それぞれのAPI 関数の
戻り値を調べ正しい戻り値が返っているか確認して下さい。
エラー値が返っているなら、そのAPIの宣言等を調べ直して下さい。
未確認ですが、VB2008 なら、System.Printing.PrintSystemJobInfo あたりを調べて見たらどうでしょうか?
(私も、手が空いたら試して見る心算ですが)
    • good
    • 0
この回答へのお礼

ありがとうございます。
SetPrinter の宣言を見直して実行できました。
助かりました。

お礼日時:2010/02/02 11:41

確認しましたところ、PrintSystemJobInfo クラスを使ってジョブの


一覧を取得する事ができ、PrintSystemJobInfo.Cancel メソッド で
ジョブを削除する事ができました。
コードも5~6行程度のものです。
後は、ご自分で調べて試して見て下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Win32APIでできましたが、PrintSystemJobInfoクラスも試してみようと思います。

お礼日時:2010/02/02 11:42

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