初めまして。
VB.Netで印刷JOBの取得・変更(キャンセル等)をしたいです。
2回目のEnumJobs関数で値がおかしくなっています。
APIを使用していますが、Frameworkで出来るならそちらを使いたいです。
ご存知の方がいましたらご教授願えませんでしょうか。
長くなりましたが、よろしくお願いします。
環境:Win2000・VS.NET
<StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
Private Structure SYSTEMTIME
Public wYear As Int16
Public wMonth As Int16
Public wDayOfWeek As Int16
Public wDay As Int16
Public wHour As Int16
Public wMinute As Int16
Public wSecond As Int16
Public wMilliseconds As Int16
End Structure
<StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
Private Structure JOB_INFO_1
Public JobId As Integer
Public pPrinterName As Integer
Public pMachineName As Integer
Public pUserName As Integer
Public pDocument As Integer
Public pDatatype As Integer
Public pStatus As Integer
Public Status As Integer
Public Priority As Integer
Public Position As Integer
Public TotalPages As Integer
Public PagesPrinted As Integer
Public Submitted As SYSTEMTIME
End Structure
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const PRINTER_ACCESS_ADMINISTER = &H4&
Private Const PRINTER_ACCESS_USE = &H8&
Private Const PRINTER_ALL_ACCESS = _
(STANDARD_RIGHTS_REQUIRED Or _
PRINTER_ACCESS_ADMINISTER Or _
PRINTER_ACCESS_USE)
<DllImport("winspool.drv", CharSet:=CharSet.Auto, entrypoint:="OpenPrinter")> _
Private Shared Function OpenPrinter(ByVal pPrinterName As String, _
ByRef phPrinter As IntPtr, _
ByVal pDefault As _
PRINTER_DEFAULTS) As Integer
End Function
<DllImport("winspool.drv", CharSet:=CharSet.Auto, entrypoint:="EnumJobs")> _
Private Shared Function EnumJobs _
(<InAttribute()> ByVal hPrinter As IntPtr, _
<InAttribute()> ByVal FirstJob As Integer, _
<InAttribute()> ByVal NoJobs As Integer, _
<InAttribute()> ByVal Level As Integer, _
<OutAttribute()> ByRef pJob As JOB_INFO_1, _
<InAttribute()> ByVal cdBuf As IntPtr, _
<OutAttribute()> ByRef pcbNeeded As IntPtr, _
<OutAttribute()> ByRef pcReturned As Integer) As Integer
End Function
Private Sub Test
Dim PrintSetting As New System.Drawing.Printing.PrinterSettings
Dim strPrinterDeviceName As String
Dim udtPrinterDefaults As PRINTER_DEFAULTS
Dim hPrinter As IntPtr
Dim Ret As Integer
'標準プリンタ名を取得
strPrinterDeviceName = PrintSetting.DefaultPageSettings.PrinterSettings.PrinterName
'アクセス権を指定
With udtPrinterDefaults
.DesiredAccess = PRINTER_ALL_ACCESS
End With
Ret = OpenPrinter(strPrinterDeviceName, hPrinter, udtPrinterDefaults)
Dim lngJobInfo1FirstJob As Integer = 0
Dim lngJobInfo1EnumerateJob As Integer = 99
Dim lngJobInfo1Level As Integer = 1
Dim udtJobInfo1 As New JOB_INFO_1
Dim udtJobInfo1Buffer As New JOB_INFO_1
Dim ptrJobInfo1Needed As IntPtr
Dim ptrJobInfo1Returned As Integer
'サイズを取得
Ret = EnumJobs(hPrinter, _
lngJobInfo1FirstJob, _
lngJobInfo1EnumerateJob, _
lngJobInfo1Level, _
udtJobInfo1Buffer, _
System.IntPtr.Zero, _
ptrJobInfo1Needed, _
ptrJobInfo1Returned)
If ptrJobInfo1Needed.Equals(System.IntPtr.Zero) Then
Exit Sub
End If
'ここでバグる!?
Ret = EnumJobs(hPrinter, _
lngJobInfo1FirstJob, _
lngJobInfo1EnumerateJob, _
lngJobInfo1Level, _
udtJobInfo1Buffer, _
ptrJobInfo1Needed, _
ptrJobInfo1Needed, _
ptrJobInfo1Returned)
End Sub
自己解決。
EnumJobsのpJobをByteにする事により成功しました!
<DllImport("winspool.drv", CharSet:=CharSet.Auto, entrypoint:="EnumJobs")> _
Private Shared Function EnumJobs _
(<InAttribute()> ByVal hPrinter As IntPtr, _
<InAttribute()> ByVal FirstJob As Integer, _
<InAttribute()> ByVal NoJobs As Integer, _
<InAttribute()> ByVal Level As Integer, _
<OutAttribute()> ByRef pJob As Byte, _
<InAttribute()> ByVal cdBuf As IntPtr, _
<OutAttribute()> ByRef pcbNeeded As IntPtr, _
<OutAttribute()> ByRef pcReturned As Integer) As Integer
End Function