Windows API 함수 OpenPrinter
및 GetPrinter
을 사용해야합니다. GetPrinter
을 호출 할 때 pDevMode
구성원이 DEVMODE
으로 설정된 상태로 반환되는 PRINTER_INFO_2
레코드를 전달하십시오. 그 DEVMODE
레코드는 (다른 것들 중에서) 데이터 정렬 사용 여부에 대한 플래그를 포함합니다.
다음은 TeamB의 Dr. Peter Below가 작성한 이전 Borland NG 게시물입니다. 프린터 설정을 영구적으로 업데이트하는 방법을 보여 주지만 OpenPrinter
, GetPrinter
, ClosePrinter
및 PRINTER_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의 dmCollate 값은 정확히 내가 찾고자하는 것입니다. 당신 없이는 절대로 이것을 발견하지 못했을 것입니다. 정말 고맙습니다! –
기꺼이 도와 드리겠습니다. :-) 나는 거의 모든 일이 API로 끝나야 만했던 옛날부터 그것을 기억했다. ;-) –