From 35ede8b695403201d452f9e32a3aff9509fefb65 Mon Sep 17 00:00:00 2001 From: jesus Date: Fri, 30 May 2008 15:10:51 +0000 Subject: [PATCH] printers, fix selecting default printer and updating devmode (windows) git-svn-id: trunk@15278 - --- components/printers/win32/winprinters.inc | 49 ++++++++++++----------- components/printers/win32/winutilprn.pas | 5 +-- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/components/printers/win32/winprinters.inc b/components/printers/win32/winprinters.inc index 3d42ed28b0..e0438ea187 100644 --- a/components/printers/win32/winprinters.inc +++ b/components/printers/win32/winprinters.inc @@ -192,33 +192,32 @@ var PDev: TPrinterDevice; dwRet: Integer; begin - result := false; + if FPrinterHandle=0 then begin + result := false; + exit; + end; + // now we have a right FPrinterHandle, get current printer settings PDev := TPrinterDevice(Printers.Objects[APrinterIndex]); - // allocate a new Devmode - if (Pdev.DevMode=nil) then begin + // 1. Determine the required size of the buffer from the device, + // and then allocate enough memory for it. + PDev.DevModeSize := DocumentProperties(0, FPrinterHandle, pchar(PDev.Name), + nil, nil, 0); + ReallocMem(Pdev.DevMode, PDev.DevModeSize); + if PDev.DevModeSize=0 then begin + result := false; + exit; + end; - // 1. Determine the required size of the buffer from the device, - // and then allocate enough memory for it. - PDev.DevModeSize:=DocumentProperties(0, FPrinterHandle, pchar(PDev.Name), - nil, nil, 0); - if PDev.DevModeSize<=0 then begin - // error - exit; - end; - GetMem(PDev.DevMode, PDev.DevModeSize); - - // 2. Ask the device driver to initialize the DEVMODE buffer with - // the default settings. - dwRet := DocumentProperties(0, FPrinterHandle, pchar(Pdev.Name), - PDev.DevMode, nil, DM_OUT_BUFFER); - result := (dwRet=IDOK); - if not result then begin - FreeMem(PDev.DevMode); - PDev.DevMode:=nil; - end; - + // 2. Ask the device driver to initialize the DEVMODE buffer with + // the default settings. + dwRet := DocumentProperties(0, FPrinterHandle, pchar(Pdev.Name), + PDev.DevMode, nil, DM_OUT_BUFFER); + result := (dwRet=IDOK); + if not result then begin + ReallocMem(PDev.Devmode, 0); + exit; end; end; @@ -596,8 +595,12 @@ begin PDev:=TPrinterDevice(Printers.Objects[i]); if not OpenPrinter(PChar(PDev.Name),fPrinterHandle, nil) then + begin + FprinterHandle := 0; raise EPrinter.CreateFmt('OpenPrinter exception : %s', [SysErrorMessage(GetlastError)]); + end; + if UpdateDevMode(i) then begin SetDC; Result:=i; diff --git a/components/printers/win32/winutilprn.pas b/components/printers/win32/winutilprn.pas index b03fd7cc9c..899a8f1c3d 100644 --- a/components/printers/win32/winutilprn.pas +++ b/components/printers/win32/winutilprn.pas @@ -344,10 +344,7 @@ implementation destructor TPrinterDevice.destroy; begin - if DevMode<>nil then begin - FreeMem(DevMode); - DevMode:=nil; - end; + ReallocMem(DevMode, 0); inherited destroy; end;