2013-01-21 69 views
3

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

我知道如何使用DeviceCapabilities打印机可以对比检验是否调用传递DC_COLLATE但是这并没有告诉我的打印驱动程序是否设置为整理与否,只有打印机有整理的能力,不是它 collat​​e。

为什么?

我想在Delphi的XE2中解决QuickReports中的一个问题,在那里我们的程序不再像Delphi 6编译时那样工作。使用Delphi 6的版本,无论QuickReport的设置如何,它总是遵守分类设置在打印机驱动程序中。使用Delphi XE2版本并没有。

用户没有更改整理设置的安全性,它们被系统管理员强制打开,这些文档需要在指定的打印机上打印排序。

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

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

干杯!

回答

4

您需要使用Windows API函数OpenPrinterGetPrinter。当致电GetPrinter时,传递PRINTER_INFO_2记录,将pDevMode成员设置为DEVMODE; DEVMODE记录包含是否启用排序规则(除其他外)的标志。

以下是由TeamB的Dr. Peter Below撰写的Borland NG老帖子。它演示了更新打印机设置以使其成为永久性的,但它包括使用OpenPrinterGetPrinter,ClosePrinterPRINTER_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; 
+0

太棒了!太棒了! pPI.pDevMode中的dmCollat​​e值完全是我需要查找的。永远,如果没有你,永远不会发现。非常感谢! –

+0

很高兴我能帮到你。 :-)我记得过去几乎所有事情都需要用API来完成。 ;-) –

相关问题