startdocprinter возвращает неверную ненулевую очередь печати JobID. Это недействительно и уменьшается при последующих запусках

Я использую слегка измененную версию примера vb.net/win32 кода MSKB RawPrinterHelper для отправки заданий печати RAW в очередь печати.

Все отлично работает, катится, печатается, и в целом жизнь хороша, однако идентификатор, который я получаю из StartDocPrinter, нельзя использовать для просмотра состояния задания печати. Это просто неправильно.

JobID, необходимый для поиска статуса задания с помощью ManagementObjectSearcher, не совпадает с идентификатором, возвращаемым StartDocPrinter.

Еще более странным является то, что StartDocPrinter возвращает дескриптор, который уменьшается при каждом вызове.

Это выглядит почти как некое условие переполнения со знаком или без знака.

Одна вещь, о которой я подумал, что я не могу найти ссылку, это то, что StartDocPrinter и "все остальное" не возвращают / не используют один и тот же JobID, но я не нашел окончательной ссылки или способа преобразования между ними.

Любая помощь приветствуется!

Терри

РЕДАКТИРОВАТЬ

УЖАСНЫЙ УРОВЕНЬ: Бесконечный

Я написал приложение для мониторинга очереди печати и непрерывно возвращал список PrintSystemJobInfo.JobIdentifiers из очереди печати.

В то время как задание печати спулинговое, оно имеет идентификатор, который находится в диапазоне 29 000, и каждое новое задание уменьшает его на единицу. ТЕМ НЕ МЕНИЕ.,,,

После того, как задание закончило буферизацию, PrintSystemJobInfo.JobIdentifier изменяется и становится "обычным" JobIdentifier в диапазоне 200, в возрастающей последовательности, прямо в линию со всеми другими заданиями.

Что я узнал, так это то, что мое объявление выглядит нормально, и JobIdentifier фактически изменяется, когда задание заканчивается буферизацией.

?????

`

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Structure DOCINFOW
    <MarshalAs(UnmanagedType.LPWStr)> Public pDocName As String
    <MarshalAs(UnmanagedType.LPWStr)> Public pOutputFile As String
    <MarshalAs(UnmanagedType.LPWStr)> Public pDataType As String
End Structure

<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _
   SetLastError:=True, CharSet:=CharSet.Unicode, _
   ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As UInt32
End Function


Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32, JobName As String) As UInteger

    Dim hPrinter As IntPtr
    Dim dwError As Int32
    Dim di As New DOCINFOW

    Dim dwWritten As Int32
    Dim pjID As UInteger = 0

    Dim PrintQueueName As String = ""
    Dim PrintServerName As String = ""

    Try
        Dim pd As New PRINTER_DEFAULTS

        With di
            .pDocName = JobName
            .pDataType = "RAW"
        End With

        If OpenPrinter(szPrinterName, hPrinter, pd) Then  
            pjID = StartDocPrinter(hPrinter, 1, di)
            If pjID = 0 Then
              ' it's an error. 
            Else
                    If StartPagePrinter(hPrinter) Then
                        If WritePrinter(hPrinter, pBytes, dwCount, dwWritten) = False Then
                            dwError = Marshal.GetLastWin32Error()

                        End If
                        EndPagePrinter(hPrinter)
                    End If
                End If
                EndDocPrinter(hPrinter)
            End If
            ClosePrinter(hPrinter)
        End If

    Return pjID
End Function

`

0 ответов

Другие вопросы по тегам