2013-01-21 5 views
3

Windows 프린터가 특정 프린터에 대해 한 부씩 인쇄 기능을 설정했는지 확인하기 위해 설정 한 프린터 드라이버 설정을 캡처해야합니다.프린터 드라이버의 한 부씩 인쇄 설정은 어떻게 얻을 수 있습니까?

내가 DeviceCapabilities을 사용하여 프린터 한 부씩 인쇄가 DC_COLLATE 전달 호출 여부를 얻는 방법을 알고 있지만이 프린트 드라이버는 대조로 설정할지 여부를 말하지 않는, 프린터가 대조 할 수있는 능력이있는 경우에만 것을, 그렇지 않다면 일 것입니다.

왜?

우리 프로그램이 더 이상 Delphi 6에서 컴파일 할 때와 같은 방식으로 작동하지 않는 Delphi XE2와 함께 QuickReports에서 문제를 해결하려고합니다. QuickReport의 설정에 상관없이 Delphi 6 버전에서는 항상 한 부씩 설정 프린터 드라이버에서. Delphi XE2 버전에서는 그렇지 않습니다.

사용자는 한 부씩 인쇄 설정을 변경할 수있는 보안 기능이 없으며 시스템 관리자가 강제로 설정하고 이러한 문서를 지정된 프린터에서 한 부씩 인쇄해야합니다.

드라이버가 항상 한 부씩 인쇄되도록 설정되어 있는지 확인할 수있는 경우 QuickReport에서 한 부씩 인쇄 설정을 강제로 수행 할 수 있으며 위의 내 질문에 따라 필요한 작업을 수행합니다.

언제나처럼 생각합니다.

건배!

답변

4

Windows API 함수 OpenPrinterGetPrinter을 사용해야합니다. GetPrinter을 호출 할 때 pDevMode 구성원이 DEVMODE으로 설정된 상태로 반환되는 PRINTER_INFO_2 레코드를 전달하십시오. 그 DEVMODE 레코드는 (다른 것들 중에서) 데이터 정렬 사용 여부에 대한 플래그를 포함합니다.

다음은 TeamB의 Dr. Peter Below가 작성한 이전 Borland NG 게시물입니다. 프린터 설정을 영구적으로 업데이트하는 방법을 보여 주지만 OpenPrinter, GetPrinter, 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의 dmCollate 값은 정확히 내가 찾고자하는 것입니다. 당신 없이는 절대로 이것을 발견하지 못했을 것입니다. 정말 고맙습니다! –

+0

기꺼이 도와 드리겠습니다. :-) 나는 거의 모든 일이 API로 끝나야 만했던 옛날부터 그것을 기억했다. ;-) –