Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中删除打印队列_Delphi_Printqueue - Fatal编程技术网

如何在Delphi中删除打印队列

如何在Delphi中删除打印队列,delphi,printqueue,Delphi,Printqueue,我使用的是PDF控件套件,它在启动时自动创建打印队列,但偶尔,如果应用程序异常终止,队列不会被删除,因此在下一次启动时,它会创建一个副本 我可以使用打印机列表检查打印队列以找到它,但我看不到如何删除特定队列。使用Winspool,打印机 GetCurrentPrinterHandle 检索当前打印机的句柄 @返回当前打印机的API打印机句柄 @Desc使用WinSpool.OpenPrinter获取打印机句柄。来电者 获取句柄的所有权,并且必须对其调用ClosePrinter 一旦不再需要手柄。

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


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

使用Winspool,打印机

GetCurrentPrinterHandle

检索当前打印机的句柄 @返回当前打印机的API打印机句柄 @Desc使用WinSpool.OpenPrinter获取打印机句柄。来电者 获取句柄的所有权,并且必须对其调用ClosePrinter 一旦不再需要手柄。如果做不到这一点,就会造成严重后果 严重的资源泄漏

Uses子句中需要打印机和WinSpool。 @如果OpenPrinter调用失败,则引发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 } 

这不是你的应用程序的用户可以决定的吗?要求打印作业。在应用程序启动时检查队列是否存在。@NGLN我在启动时检查,看到一个副本,但当前无法删除它。我的应用程序是特定队列的唯一用户。用户不希望看到同一队列的多个副本。这也会造成许可问题。与其自动创建打印队列,为什么不先检查现有的打印队列并使用它呢?