VB.Netで印刷JOBの取得・変更

解決


紅蓮@夜は長ひ  2004-07-14 19:22:52  No: 114806  IP: [192.*.*.*]

初めまして。
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

編集 削除
紅蓮@夜は長ひ  2004-07-15 18:55:32  No: 114807  IP: [192.*.*.*]

自己解決。
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

編集 削除