【问题标题】:How can I get the COLLATE setting of a printer driver?如何获取打印机驱动程序的 COLLATE 设置?
【发布时间】:2013-01-21 21:30:24
【问题描述】:

我需要捕获 Windows 机器设置的打印机驱动程序设置,以确定它们是否已为特定打印机打开分页。

我知道如何使用传入 DC_COLLATE 的 DeviceCapabilities 调用来获取打印机是否可以进行整理,但这并不能告诉我打印驱动程序是否设置为整理,只是打印机具有整理的能力,而不是它整理。

为什么?

我正在尝试使用 Delphi XE2 解决 QuickReports 中的一个问题,即我们的程序不再像在 Delphi 6 下编译时那样工作。对于 Delphi 6 版本,无论 QuickReport 中的设置如何,它始终遵循中的整理设置打印机驱动程序。在 Delphi XE2 版本中则不然。

用户没有安全性来更改分页设置,系统管理员强制他们启用,并且这些文档需要在指定的打印机上打印分页。

如果我可以确定驱动程序是否设置为始终进行整理,我可以强制在 QuickReport 中进行整理设置,它会执行我需要的操作,从而解决我上面的问题。

一如既往,我很欣赏任何想法。

干杯!

【问题讨论】:

    标签: delphi printing delphi-xe2 quickreports


    【解决方案1】:

    您需要使用 Windows API 函数 OpenPrinterGetPrinter。调用GetPrinter时,传入PRINTER_INFO_2记录,返回时pDevMode成员设置为DEVMODEDEVMODE 记录包含是否启用排序规则的标志(除其他外)。

    这是 TeamB 的 Peter 博士的旧 Borland NG 帖子。它演示了更新打印机设置以使其永久化,但它包括使用OpenPrinterGetPrinterClosePrinterPRINTER_INFO_2,以及使用DEVMODE(在下面的代码中称为hDevMode );它应该让你开始。

    Procedure MakePrintersettingsPermanent;
    var
      hPrinter: THandle;
      Device : array[0..255] of char;
      Driver : array[0..255] of char;
      Port   : array[0..255] of char;
      hDeviceMode: THandle;
      pDevMode: PDeviceMode;
      bytesNeeded: Cardinal;
      pPI: PPrinterInfo2;
      Defaults: TPrinterDefaults;
      retval: BOOL;
    begin
      Assert( Printer.PrinterIndex >= 0 );
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
      FillChar( Defaults, Sizeof(Defaults), 0 );
      Defaults.DesiredAccess:= 
        PRINTER_ACCESS_ADMINISTER or PRINTER_ACCESS_USE;
      if not WinSpool.OpenPrinter(@Device, hPrinter, @Defaults ) then
            RaiseLastWin32Error;
      try
        retval := WinSpool.GetPrinter(
          hPrinter,
          2,
          Nil, 0, @bytesNeeded );
        GetMem( pPI, bytesNeeded );
        try
          retval := WinSpool.GetPrinter(
            hPrinter, 2,
            pPI, bytesNeeded, @bytesNeeded );
          If not retval Then 
            RaiseLastWin32Error;
    
          pDevMode := GlobalLock( hDeviceMode );
          Assert( Assigned( pdevmode ));
          try
            Move( pdevmode^, pPI^.pDevMode^, Sizeof( pdevmode^ ));
          finally
            GlobalUnlock( hDevicemode );
          end;
          If not WinSpool.SetPrinter(
            hPrinter, 2,
            pPI,
            0 )
          Then
            RaiseLastWin32error;
        finally
          FreeMem( pPI );
        end;
      finally
        WinSpool.ClosePrinter( hPrinter );
      end;
    end;
    

    【讨论】:

    • 太棒了!极好的! pPI.pDevMode 中的 dmCollat​​e 值正是我需要找到的东西。没有你,永远,永远不会找到这个。非常感谢!
    • 很高兴我能帮上忙。 :-) 我记得从前,几乎所有事情都必须使用 API 完成。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2021-12-07
    • 2013-03-25
    相关资源
    最近更新 更多