DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB2005での印刷ジョブ削除

環境/言語:[環境:WindowsXP、言語;VB.NET]
分類:[.NET]

現在、VB2005で印刷ジョブを削除するプログラムを作成しようとしています。

色々と調べた結果、
WinAPIのOpenPrinter関数を使用してプリンタのハンドルを取得し、
SetPrinterにて、プリンタのジョブを削除する事が可能と思い、
プログラムを作成して実行したのですが、SetPrinter関数実行時に
PInvokeStackImbalanceという警告が出力されてしまい、
ジョブが削除されません。

エラーメッセージを読んだところ、SetPrinterへ渡すパラメータが
誤っているのではないかと思っているのですが、調べても問題点が
皆目検討がつかない状況です。
以下にソースコードを記します。
申し訳ございませんが、ご教示の程よろしくお願い申し上げます。

************ソースコード**************

Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" ( _
ByVal hPrinter As Long, _
ByVal Level As Long, _
ByVal pPrinter As Byte, _
ByVal Command As Long) As Long




'プリンタのハンドルを取得する
Dim hPrinter As Long
Dim PrinterName As String

'PrintDocumentオブジェクトを生成
Dim PD As New PrintDocument

PrinterName = PD.PrinterSettings.PrinterName

If Not OpenPrinter(PrinterName, hPrinter, STANDARD_RIGHTS_REQUIRED) Then
Throw New Win32Exception(Marshal.GetLastWin32Error())
End If

Dim result = SetPrinter( _
CLng(hPrinter), _
CLng(0), _
Nothing, _
CLng(PRINTER_CONTROL_RESUME))
■No21508に返信(sskipさんの記事)
> 現在、VB2005で印刷ジョブを削除するプログラムを作成しようとしています。
> CLng(PRINTER_CONTROL_RESUME))
>

矛盾してませんか?
PRINTER_CONTROL_PURGE プリンタのすべての印刷ジョブを削除します。
PRINTER_CONTROL_RESUME 一時停止しているプリンタを再開します。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_setprinter.asp
■No21510に返信(やじゅさんの記事)
> ■No21508に返信(sskipさんの記事)
>>現在、VB2005で印刷ジョブを削除するプログラムを作成しようとしています。
>> CLng(PRINTER_CONTROL_RESUME))
> >
>
> 矛盾してませんか?
> PRINTER_CONTROL_PURGE プリンタのすべての印刷ジョブを削除します。
> PRINTER_CONTROL_RESUME 一時停止しているプリンタを再開します。
>
> http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_setprinter.asp

やじゅ様

ご指摘ありがとうございます。
PRINTER_CONTROL_PURGE の間違いでした。申し訳ありません。

ただ、PRINTER_CONTROL_PURGEに修正して実行してみても、
変わらず、PInvokeStackImbalanceが発生します。。。
原因に関して、何かお分かりになりましたら
ご助言いただければ幸いです。よろしくお願い致します。
■No21520に返信(sskipさんの記事)
> 変わらず、PInvokeStackImbalanceが発生します。。。
>

未確認です、駄目かもしれません。
PInvokeStackImbalanceは、大抵 DllImport で書いた
DLL の呼び出し部分の記述が間違っています。

Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" ( _
ByVal hPrinter As IntPtr, _
ByVal Level As Long, _
ByVal pPrinter As IntPtr, _
ByVal Command As Long) As Long
■No21524に返信(やじゅさんの記事)
> ■No21520に返信(sskipさんの記事)
>>変わらず、PInvokeStackImbalanceが発生します。。。
> >
>
> 未確認です、駄目かもしれません。
> PInvokeStackImbalanceは、大抵 DllImport で書いた
> DLL の呼び出し部分の記述が間違っています。
>
> Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" ( _
> ByVal hPrinter As IntPtr, _
> ByVal Level As Long, _
> ByVal pPrinter As IntPtr, _
> ByVal Command As Long) As Long

やじゅ様

回答が遅くなり申し訳ありません。
上記の宣言で実施てもやはりPInvokeStackImbalanceが発生しました。

やじゅ様のご指摘どおり、DLL の呼び出し部分の記述の記述を
もう少し洗ってみます。
お忙しい中、情報を頂きまして、ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板