如何在Delphi中删除打印队列

时间:2013-12-11 07:11:51

标签: delphi printqueue

我正在使用PDF控件套件,它会在启动时自动创建打印队列,但偶尔如果应用程序异常终止,则不会删除队列,因此在下次启动时会创建一个副本。 / p>

我可以使用“打印机”列表检查打印队列以找到它,但我看不到如何删除特定队列?

1 个答案:

答案 0 :(得分:2)

使用Winspool,打印机;

GetCurrentPrinterHandle

检索当前打印机的句柄 @Returns当前打印机的API打印机句柄 @Desc使用WinSpool.OpenPrinter获取打印机句柄。呼叫者,召集者   获得句柄的所有权,并且必须在其上调用ClosePrinter   一旦不再需要手柄。如果做不到就会造成这种情况   严重的资源泄漏!

  在Uses子句中需要Printers和WinSpool。 如果OpenPrinter调用失败,则@Raises EWin32Error。

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 }