Printers, windows, do not open and setup printer if it's being destroyed, issue #23026

git-svn-id: trunk@43024 -
This commit is contained in:
jesus 2013-09-29 04:49:22 +00:00
parent 88a54c3916
commit 6d093a3d09
2 changed files with 23 additions and 17 deletions

View File

@ -38,6 +38,8 @@ end;
destructor TWinPrinter.Destroy;
begin
fDestroying := true;
ClearDC;
DoResetPrintersList;
@ -84,7 +86,7 @@ end;
procedure TWinPrinter.PrinterSelected;
begin
if (PrinterIndex >= 0) and not RawMode then
if not fDestroying and (PrinterIndex >= 0) and not RawMode then
SetDC;
end;
@ -805,22 +807,26 @@ begin
if FPrinterHandle <> 0 then
ClosePrinter(FPrinterHandle);
PDev := TPrinterDevice(Printers.Objects[i]);
{$IFDEF USEUNICODE}
if not OpenPrinterW(PWideChar(UTF8Decode(PDev.Name)), @fPrinterHandle, nil) then
{$ELSE}
if not OpenPrinter(PChar(PDev.Name), @fPrinterHandle, nil) then
{$ENDIF}
begin
FprinterHandle := 0;
raise EPrinter.CreateFmt('OpenPrinter exception : %s',
[SysErrorMessage(GetlastError)]);
end;
if fDestroying then
result := i
else begin
PDev := TPrinterDevice(Printers.Objects[i]);
{$IFDEF USEUNICODE}
if not OpenPrinterW(PWideChar(UTF8Decode(PDev.Name)), @fPrinterHandle, nil) then
{$ELSE}
if not OpenPrinter(PChar(PDev.Name), @fPrinterHandle, nil) then
{$ENDIF}
begin
FprinterHandle := 0;
raise EPrinter.CreateFmt('OpenPrinter exception : %s',
[SysErrorMessage(GetlastError)]);
end;
if UpdateDevMode(i) then
Result := i
else
Result := -1;
if UpdateDevMode(i) then
Result := i
else
Result := -1;
end;
end;
end;

View File

@ -33,7 +33,7 @@ Type
fLastHandleType : THandleType;
fDC : HDC;
fPrinterHandle : THandle;
fDestroying : boolean;
procedure SetIC;
procedure SetDC;
procedure ClearDC;