mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 08:56:01 +02:00
printers, use ms recommended method to obtain default printer, issue #11301
git-svn-id: trunk@15281 -
This commit is contained in:
parent
c2e826baac
commit
a353f8dd84
@ -7,7 +7,7 @@ Uses InterfaceBase, LCLIntf, WinVer, WinUtilPrn;
|
|||||||
// todo: this ^ is a mess: mixed WinUtilPrn/Windows units clean...
|
// todo: this ^ is a mess: mixed WinUtilPrn/Windows units clean...
|
||||||
|
|
||||||
// todo: this should be a method, cant be atm because mixed units ^
|
// todo: this should be a method, cant be atm because mixed units ^
|
||||||
function GetCurrentDevMode(var DM:PDeviceMode): boolean;
|
function GetCurrentDevMode(out DM:PDeviceMode): boolean;
|
||||||
var
|
var
|
||||||
PDev: TPrinterDevice;
|
PDev: TPrinterDevice;
|
||||||
begin
|
begin
|
||||||
@ -308,6 +308,89 @@ begin
|
|||||||
AbortDoc(fDC);
|
AbortDoc(fDC);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TWinPrinter.GetDefaultPrinter: string;
|
||||||
|
|
||||||
|
const
|
||||||
|
MAXBUFSIZE = 512;
|
||||||
|
|
||||||
|
var
|
||||||
|
Needed, PrtCount: DWORD;
|
||||||
|
BoolRes: BOOL;
|
||||||
|
IntRes: Integer;
|
||||||
|
PrintInfo2Buf: pchar;
|
||||||
|
GetDefPrnFunc: function(buffer: pchar; var bufSize:DWORD):BOOL; stdcall;
|
||||||
|
SpoolerHandle: HINST;
|
||||||
|
begin
|
||||||
|
// retrieve default printer using ms blessed method, see
|
||||||
|
// see: http://support.microsoft.com/default.aspx?scid=kb;en-us;246772
|
||||||
|
result := '';
|
||||||
|
if Win32Platform=VER_PLATFORM_WIN32_WINDOWS then
|
||||||
|
begin
|
||||||
|
|
||||||
|
// Get PRINT_INFO_2 record size
|
||||||
|
SetLastError(0);
|
||||||
|
BoolRes := EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 2, nil, 0,
|
||||||
|
Needed, PrtCount);
|
||||||
|
if not BoolRes and
|
||||||
|
((GetLastError<>ERROR_INSUFFICIENT_BUFFER) or (Needed=0)) then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
// Get PRINT_INFO_2 record
|
||||||
|
GetMem(PrintInfo2Buf, Needed);
|
||||||
|
BoolRes := EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 2, PrintInfo2Buf,
|
||||||
|
Needed, Needed, PrtCount);
|
||||||
|
if not BoolRes then
|
||||||
|
begin
|
||||||
|
FreeMem(PrintInfo2Buf);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := PPRINTER_INFO_2(PrintInfo2Buf)^.pPrinterName;
|
||||||
|
FreeMem(PrintInfo2Buf);
|
||||||
|
|
||||||
|
end else
|
||||||
|
if Win32Platform=VER_PLATFORM_WIN32_NT then
|
||||||
|
begin
|
||||||
|
|
||||||
|
if Win32MajorVersion >=5 then
|
||||||
|
begin
|
||||||
|
|
||||||
|
// for Windows 2000 or later, use api GetDefaultPrinter
|
||||||
|
// TODO: needs to check WindowsUnicodeSupport
|
||||||
|
SpoolerHandle := LoadLibrary(LibWinSpool);
|
||||||
|
if SpoolerHandle = 0 then
|
||||||
|
exit;
|
||||||
|
Pointer(GetDefPrnFunc) := GetProcAddress(SpoolerHandle,'GetDefaultPrinterA');
|
||||||
|
if GetDefPrnFunc=nil then
|
||||||
|
begin
|
||||||
|
FreeLibrary(SpoolerHandle);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
PrtCount := MAXBUFSIZE;
|
||||||
|
SetLength(Result, PrtCount); // make room for printer name
|
||||||
|
BoolRes := GetDefPrnFunc(pchar(Result), prtCount);
|
||||||
|
FreeLibrary(SpoolerHandle);
|
||||||
|
PrtCount := strlen(pchar(result));
|
||||||
|
SetLength(Result, PrtCount);
|
||||||
|
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
|
||||||
|
// for NT, use GetProfileString
|
||||||
|
SetLength(result, MAXBUFSIZE);
|
||||||
|
IntRes := GetProfileString('windows', 'device', ',,,', pchar(result),
|
||||||
|
MAXBUFSIZE);
|
||||||
|
if (IntRes>0) and (pos(',',Result)<>0) then
|
||||||
|
Result := copy(Result, 1, pos(',', Result)-1)
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
//Enum all defined printers. First printer it's default
|
//Enum all defined printers. First printer it's default
|
||||||
procedure TWinPrinter.DoEnumPrinters(Lst: TStrings);
|
procedure TWinPrinter.DoEnumPrinters(Lst: TStrings);
|
||||||
Var Flags : DWORD;
|
Var Flags : DWORD;
|
||||||
@ -317,37 +400,12 @@ Var Flags : DWORD;
|
|||||||
Buffer : PChar;
|
Buffer : PChar;
|
||||||
InfoPrt : PChar;
|
InfoPrt : PChar;
|
||||||
i : Integer;
|
i : Integer;
|
||||||
DefaultPrinter : array[0..79] of Char;
|
DefaultPrinter : string;
|
||||||
PDev : TPrinterDevice;
|
PDev : TPrinterDevice;
|
||||||
TmpDevMode : PDeviceMode;
|
TmpDevMode : PDeviceMode;
|
||||||
begin
|
begin
|
||||||
Level:=5; //Compatible with all Win32 versions
|
|
||||||
DefaultPrinter:='';
|
|
||||||
|
|
||||||
//Retrieve Default printer
|
|
||||||
Flags:=PRINTER_ENUM_DEFAULT;
|
|
||||||
//Evaluate buffer size
|
|
||||||
Needed:=0;
|
|
||||||
EnumPrinters(Flags,nil,Level,nil,0,Needed,PrtCount);
|
|
||||||
if Needed>0 then
|
|
||||||
begin
|
|
||||||
GetMem(Buffer,Needed);
|
|
||||||
try
|
|
||||||
//Get default printer
|
|
||||||
if EnumPrinters(Flags,nil,Level,Buffer,Needed,Needed,PrtCount) then
|
|
||||||
DefaultPrinter:=PPRINTER_INFO_5(Buffer)^.pPrinterName;
|
|
||||||
finally
|
|
||||||
FreeMem(Buffer);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
GetProfileString(PChar('windows'),PChar('device'),PChar(''),
|
|
||||||
DefaultPrinter,SizeOf(DefaultPrinter));
|
|
||||||
if pos(',',DefaultPrinter)<>0 then
|
|
||||||
DefaultPrinter:=Copy(DefaultPrinter,1,Pos(',',DefaultPrinter)-1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
DefaultPrinter := GetDefaultPrinter;
|
||||||
|
|
||||||
Flags:=PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
|
Flags:=PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
|
||||||
Level:=2;
|
Level:=2;
|
||||||
|
@ -47,7 +47,7 @@ Type
|
|||||||
function UpdateDevMode(APrinterIndex:Integer): boolean;
|
function UpdateDevMode(APrinterIndex:Integer): boolean;
|
||||||
|
|
||||||
protected
|
protected
|
||||||
//function GetDefaultPrinter : String;
|
function GetDefaultPrinter: string;
|
||||||
procedure DoBeginDoc; override;
|
procedure DoBeginDoc; override;
|
||||||
procedure DoNewPage; override;
|
procedure DoNewPage; override;
|
||||||
procedure DoEndDoc(aAborded : Boolean); override;
|
procedure DoEndDoc(aAborded : Boolean); override;
|
||||||
|
Loading…
Reference in New Issue
Block a user