Как я могу удалить очередь печати в Delphi

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

Я могу проверить очереди печати, чтобы найти его, используя список принтеров, но я не вижу, как удалить определенную очередь?

1 ответ

Использует Winspool, принтеры;

GetCurrentPrinterHandle

Получает дескриптор текущего принтера. @ Возвращает дескриптор принтера API для текущего принтера. @Desc Использует WinSpool.OpenPrinter, чтобы получить дескриптор принтера. Вызывающий объект становится владельцем дескриптора и должен вызвать для него метод ClosePrinter, если дескриптор больше не нужен. Невыполнение этого требования приводит к серьезной утечке ресурсов!

Требуются принтеры и WinSpool в разделе "Использование". @Raises EWin32Error в случае сбоя вызова OpenPrinter.

Function GetCurrentPrinterHandle: THandle;
      Const
        Defaults: TPrinterDefaults = (
          pDatatype : nil;
          pDevMode  : nil;
          DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER
    );
      Var
        Device, Driver, Port : array[0..255] of char;
        hDeviceMode: THandle;
      Begin { GetCurrentPrinterHandle }
        Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
        If not OpenPrinter(@Device, Result, @Defaults) Then
          RaiseLastWin32Error;
      End; { GetCurrentPrinterHandle }

    {: Kill all pending jobs on the current printer }
    Procedure PurgeJobsOnCurrentPrinter;
      Var
        hPrinter: THandle;
      Begin
        hPrinter:= GetCurrentPrinterHandle;
        try
          If not WinSpool.SetPrinter( hPrinter, 0, nil,
    PRINTER_CONTROL_PURGE )
          Then
            RaiseLastWin32Error;
        finally
          ClosePrinter( hPrinter );
        end;
      End; { PurgeJobsOnCurrentPrinter } 
Другие вопросы по тегам