Hi

Further to my original post I have identified the following additional info

1.  The code works without fix if I just use the Printer.  However this 
code is part of a multi threaded system so I don't want to use the 
'global' printer instance.
2.  The fix only needs to have the 'SelPrinter.SetPrinter(Device, 
Driver, Port, 0);' added.  This sets the 'default' printer the 
SelPrinter accesses. In the original fix 'hDevMode'  returned by both 
calls to GetPrinter is the same, so the only thing that is changing is 
the data retrieved by GlobalLock.

Thanks
Rob


On 13/01/2016 2:29 p.m., Robert Martin wrote:
> Hi All, happy New Year
>
> I am having some problems reading the paper source (tray) from the
> printer.  We use the following code....
>
>
>
> var
>       SelPrinter          : TPrinter;
>       Buffer1             : Array[0..255] of char;
>       Buffer2             : Array[0..255] of char;
>       Buffer3             : Array[0..255] of char;
>
>       Device              : pChar;
>       Driver              : pChar;
>       Port                : pchar;
>
>       hDevMode            : THandle;
>       PDevMode            : pDeviceMode;
> begin
>       Result := -1;       //Indicates failure
>
>       Device := Buffer1;
>       Driver := Buffer2;
>       Port   := Buffer3;
>
>       SelPrinter := TPrinter.Create;
>       try
>           SelPrinter.PrinterIndex :=
> SelPrinter.Printers.IndexOf(aPrinterName);
>
>           SelPrinter.GetPrinter(Device, Driver, Port, hDevMode);
>
>
>           if (hDevMode <> 0) then begin
>               try
>                   try
>                       pDevMode := GlobalLock(hDevMode);
>
>                       Result := pDevMode^.dmDefaultSource;
>
>                       ShowMessage(pDevMode^.dmDeviceName);
>                   finally
>                       GlobalUnlock(hDevMode);
>                   end;
>
>                   pDevMode := nil;
>               except
>                   //Ignore errors
>               end;
>           end;
>       finally
>           SelPrinter.Free;
>       end;
>
>
>
> We thought this code worked but have discovered that if the printer
> being checked is not the system default printer the
> SelPrinter.GetPrinter(Device, Driver, Port, hDevMode); call returns the
> Device, Driver and Port of the requested (non default) printer but the
> hDevMode is that of the system default printer !!!!!
>
> Doing the following makes it work correctly
>
>           SelPrinter.PrinterIndex :=
> SelPrinter.Printers.IndexOf(aPrinterName);
>
>           SelPrinter.GetPrinter(Device, Driver, Port, hDevMode);
>
>           //Code added
>           SelPrinter.SetPrinter(Device, Driver, Port, 0);
>           SelPrinter.GetPrinter(Device, Driver, Port, hDevMode);
>
>
> This is pretty 'Yuk' though.  I am passing in 0 to the SetPrinter which
> doesn't seem right.  Feels like a Delphi bug, any suggestions ?
>
> Thanks
> Rob
>
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: [email protected]
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to [email protected] with 
> Subject: unsubscribe
>
>
> -----
> No virus found in this message.
> Checked by AVG - www.avg.com
> Version: 2016.0.7294 / Virus Database: 4489/11386 - Release Date: 01/12/16
>
>

_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: [email protected]
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to [email protected] with 
Subject: unsubscribe

Reply via email to