Getting the Printer driver and port name from TPrinter's

Question:

How can I get the Printer driver and port name from TPrinter's GetPrinter() method?

Answer:

Sometimes, these parameters will return blank string. You can use the Windows API function GetProfileString() to retrieve the associated driver and port from the Windows.ini file.

Example:

uses Printers;

 

{$IFNDEF WIN32}

 const MAX_PATH = 144;

{$ENDIF}

 

procedure TForm1.Button1Click(Sender: TObject);

var

  pDevice : pChar;

  pDriver : pChar;

  pPort : pChar;

  hDMode : THandle;

begin

  if PrintDialog1.Execute then begin

  GetMem(pDevice, cchDeviceName);

  GetMem(pDriver, MAX_PATH);

  GetMem(pPort, MAX_PATH);

  Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

  if lStrLen(pDriver) = 0 then begin

  GetProfileString('Devices', pDevice, '', pDriver, MAX_PATH);

  pDriver[pos(',', pDriver) - 1] := #0;

  end;

  if lStrLen(pPort) = 0 then begin

  GetProfileString('Devices', pDevice, '', pPort, MAX_PATH);

  lStrCpy(pPort, @pPort[lStrLen(pPort)+2]);

  end;

  Memo1.Lines.Add('Device := ' + StrPas(pDevice));

  Memo1.Lines.Add('Driver := ' + StrPas(pDriver));

  Memo1.Lines.Add('Port := ' + StrPas(pPort));

  FreeMem(pDevice, cchDeviceName);

  FreeMem(pDriver, MAX_PATH);

  FreeMem(pPort, MAX_PATH);

  end;

end;