【问题标题】:How can I delete a print queue in Delphi如何在 Delphi 中删除打印队列
【发布时间】:2013-12-11 07:11:50
【问题描述】:

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

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

【问题讨论】:

  • 这不是由您应用的用户决定的吗?请求打印作业。在应用启动时检查队列是否存在。
  • @NGLN 我确实检查了启动,看到重复,但目前无法删除它。我的应用程序是特定队列的唯一用户。用户不希望看到同一队列的多个副本。它还会产生许可问题。
  • 与其自动创建打印队列,不如先检查现有的并使用它?

标签: delphi printqueue


【解决方案1】:

使用 Winspool、打印机;

GetCurrentPrinterHandle

获取当前打印机的句柄 @返回当前打印机的 API 打印机句柄 @Desc 使用 WinSpool.OpenPrinter 获取打印机句柄。呼叫者,召集者 拥有句柄的所有权,并且必须在其上调用 ClosePrinter 一旦不再需要手柄。不这样做会创建一个 严重的资源泄露!

在 Uses 子句中需要 Printers 和 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 } 

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 2012-09-19
    • 2014-04-12
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多