delphi3000.com - the free delphi knowledge platform
delphi3000.com - the free delphi knowledge platform
490 Users Online NOW
Have a look at your member-status

connecting people's knowledge


  - Recent ArticlesRSS feed for Recent Articles on delphi3000.com
  - List of All Articles
  - Top Viewed Articles
  - Articles (+Attachem.)
  - Articles Of Interest
  - Categories
  - Top Uploader
  - Search
  - Index

  - My Home
  - Submit an Article
  - My Articles
  - My Personal Data
  - My Bookmarks
  - Activities
  - Login/Logout

  - Sign Up
  - Why Sign Up
  - Newsletter

  - Press
  - Advertise

  - Contact
  - Feedback





Community
Borland
ClubeDelphi
Dr. Bob
UK-BUG
Delphi Meetings
Planeta Delphi



Loremo - the 1.5 liter car coming in 2009




Startblatt.de






Share this article with friendsShare this article with friends
Rate this articleRate this article - to keep the quality of delphi3000.com !
Comment this article or read through previous comments (1)


Getting Detailled Printer InformationGo to Christophe Geers's websiteFormat this article printer-friendly!Bookmark function is only available for registered users!
Get detailled information of any of the installed printers on your pc
Product:
Delphi 4.x (or higher)
Category:
VCL-General
Skill Level:
Scoring:
Last Update:
01/10/2002
Search Keys:
delphi delphi3000 article borland vcl code-snippet TPrinter Winspool Printer Informtation PPrinterInfo PPrinterInfo2
Times Scored:
2
Visits:
3127
Uploader: Christophe Geers
Company: ANDROME nv
Reference: N/A
 
Question/Problem/Abstract:
How to retrieve detailled information of any of the installed printers on your computer using winspool.
Answer:



Tested with Delphi 6 Professional version on Windows 2000 Professional.

This is an example application using function to retrieve detailled information about a printer. The application needs one TMemo and one TCombobox with an
OnChange event.
The name of the form is "FPrint" and it has an OnShow-event

unit unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, TabEdit, Printers, Buttons, WinSpool;

type
  TPrinterInfo = record
    SeverName         : PChar;
    PrinterName       : PChar;
    ShareName         : PChar;
    PortName          : PChar;
    DriverName        : PChar;
    Comment           : PChar;
    Location          : PChar;
    DeviceMode        : PDeviceModeA;
    SepFile           : PChar;
    PrintProcessor    : PChar;
    DataType          : PChar;
    Parameters        : PChar;
    SecurityDescriptor: PSecurityDescriptor;
    Attributes        : Cardinal;
    DefaultPriority   : Cardinal;
    StartTime         : Cardinal;
    UntilTime         : Cardinal;
    Status            : Cardinal;
    Jobs              : Cardinal;
    AveragePPM        : Cardinal;
  end;

  TFPrint = class(TForm)
    Memo1: TMemo;
    ComboBox1: TComboBox;
    procedure FormShow(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function GetCurrentPrinterInformation: TPrinterInfo;
  function GetCurrentPrinterHandle: THandle;

var
  FPrint: TFPrint;

implementation

{$R *.dfm}

function GetCurrentPrinterHandle: THandle;
var
  Device, Driver, Port : array[0..255] of char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not OpenPrinter(@Device, Result, nil) then
    RaiseLastWin32Error;
end;

function GetCurrentPrinterInformation: TPrinterInfo;
var
  hPrinter  : THandle;
  pInfo:  PPrinterInfo2;
  bytesNeeded: DWORD;
begin
  hprinter := GetCurrentPrinterHandle;
  try
    Winspool.GetPrinter( hPrinter, 2, Nil, 0, @bytesNeeded );
    pInfo := AllocMem( bytesNeeded );
    try
      Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded );
       Result.SeverName          := pInfo^.pServerName;
       Result.PrinterName        := pInfo^.pPrinterName;
       Result.ShareName          := pInfo^.pShareName;
       Result.PortName           := pInfo^.pPortName;
       Result.DriverName         := pInfo^.pDriverName;
       Result.Comment            := pInfo^.pComment;
       Result.Location           := pInfo^.pLocation;
       Result.DeviceMode         := pInfo^.pDevMode;
       Result.SepFile            := pInfo^.pSepFile;
       Result.PrintProcessor     := pInfo^.pPrintProcessor;
       Result.DataType           := pInfo^.pDatatype;
       Result.Parameters         := pInfo^.pParameters;
       Result.SecurityDescriptor := pInfo^.pSecurityDescriptor;
       Result.Attributes         := pInfo^.Attributes;
       Result.DefaultPriority    := pInfo^.DefaultPriority;
       Result.StartTime          := pInfo^.StartTime;
       Result.UntilTime          := pInfo^.UntilTime;
       Result.Status             := pInfo^.Status;
       Result.Jobs               := pInfo^.cJobs;
       Result.AveragePPM         := pInfo^.AveragePPM;
    finally
      FreeMem( pInfo );
    end;
  finally
    ClosePrinter( hPrinter );
  end;
end;


procedure TFPrint.FormShow(Sender: TObject);
begin
  ComboBox1.Items.Assign(Printer.Printers);
  ComboBox1.ItemIndex := 0;
  ComboBox1.OnChange(nil);
end;

procedure TFPrint.ComboBox1Change(Sender: TObject);
var
  PrinterInfo: TPrinterInfo;
begin
  PrinterInfo := GetCurrentPrinterInformation;
  memo1.Clear;
  with memo1.Lines do
  begin
    Add('GENERAL INFORMATION');
    Add('');
    Add('ServerName: ' + PrinterInfo.SeverName);
    Add('PrinterName: ' + PrinterInfo.PrinterName);
    Add('ShareName: ' + PrinterInfo.ShareName);
    Add('PortName: ' + PrinterInfo.PortName);
    Add('DriverName: ' + PrinterInfo.DriverName);
    Add('Comment: ' + PrinterInfo.Comment);
    Add('Location: ' + PrinterInfo.Location);
    Add('SepFile: ' + PrinterInfo.SepFile);
    Add('PrintProcessor: ' + PrinterInfo.PrintProcessor);
    Add('DataType: ' + PrinterInfo.DataType);
    Add('Parameters: ' + PrinterInfo.Parameters);
    Add('Attributes: ' + IntToStr(PrinterInfo.Attributes));
    Add('DefaultPriority: ' + IntToStr(PrinterInfo.DefaultPriority));
    Add('StartTime: ' + IntToStr(PrinterInfo.StartTime));
    Add('UntilTime: ' + IntToStr(PrinterInfo.UntilTime));
    Add('Status: ' + IntToStr(PrinterInfo.Status));
    Add('Jobs: ' + IntToStr(PrinterInfo.Jobs));
    Add('AveragePPM: ' + IntToStr(PrinterInfo.AveragePPM));
    Add('');
    Add('DEVICEMODE INFORMATION');
    Add('');

    Add('DeviceName: ' + PrinterInfo.DeviceMode.dmDeviceName);
    Add('SpecVersion: ' + IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));
    Add('DriverVersion: ' + IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));
    Add('Size: ' + IntToStr(PrinterInfo.DeviceMode.dmSize));
    Add('DriverExtra: ' + IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));
    Add('Fields: ' + IntToStr(PrinterInfo.DeviceMode.dmFields));
    Add('Orientation: ' + IntToStr(PrinterInfo.DeviceMode.dmOrientation));
    Add('PaperSize: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperSize));
    Add('PaperLength: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperLength));
    Add('PaperWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));
    Add('Scale: ' + IntToStr(PrinterInfo.DeviceMode.dmScale));
    Add('Copies: ' + IntToStr(PrinterInfo.DeviceMode.dmCopies));
    Add('DefaultSource: ' + IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));
    Add('PrintQuality: ' + IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));
    Add('Color: ' + IntToStr(PrinterInfo.DeviceMode.dmColor));
    Add('Duplex: ' + IntToStr(PrinterInfo.DeviceMode.dmDuplex));
    Add('YResolution: ' + IntToStr(PrinterInfo.DeviceMode.dmYResolution));
    Add('TTOption: ' + IntToStr(PrinterInfo.DeviceMode.dmTTOption));
    Add('Collate: ' + IntToStr(PrinterInfo.DeviceMode.dmCollate));
    Add('LogPixels: ' + IntToStr(PrinterInfo.DeviceMode.dmLogPixels));
    Add('BitsPerPel: ' + IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));
    Add('PelsWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));
    Add('PelsHeight: ' + IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));
    Add('DisplayFlags: ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));
    Add('DisplayFrequency: ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));
    Add('ICMMethod: ' + IntToStr(PrinterInfo.DeviceMode.dmICMMethod));
    Add('ICMintent: ' + IntToStr(PrinterInfo.DeviceMode.dmICMIntent));
    Add('MediaType: ' + IntToStr(PrinterInfo.DeviceMode.dmMediaType));
    Add('DitherType: ' + IntToStr(PrinterInfo.DeviceMode.dmDitherType));
    Add('ICCManufacturer: ' + IntToStr(PrinterInfo.DeviceMode.dmICCManufacturer));
    Add('ICCModel: ' + IntToStr(PrinterInfo.DeviceMode.dmICCModel));
    Add('PanningWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPanningWidth));
    Add('PanningHeight: ' + IntToStr(PrinterInfo.DeviceMode.dmPanningHeight));
  end;
end;

end.





Please rate this article!
Skill level:
BeginnerExpert

Useful:
No!Very!

Overall rating:
PoorExcellent



Comments to this article
Write a new comment
Problem: accessing freed memory
    Andreas Schmidt (Jan 29 2004 1:51PM)

I believe, that the function GetCurrentPrinterInformation
uses memory that is already freed.

    pInfo := AllocMem( bytesNeeded );
    try
      Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded );
       Result.ServerName          := pInfo^.pServerName;
// Result.ServerName is a pointer to char
// it points somewhere in the allocated memory "pInfo"
       ....
    finally
      FreeMem( pInfo );
// if "pInfo" isn't valid anymore, Result.ServerName
// can't be valid, too !!
    end;

The function GetCurrentPrinterInformation seems to work
at the first glance, but it leaves the caller with Pointers
to invalid memory.

var
   pi : TPrinterInfo;
begin
   Pi := GetCurrentPrinterInformation;

   // displays pi.DriverName
   ShowMessage(pi.DriverName);

   // Get some memory, fill it with $0 and free the block
   FreeMem(AllocMem(1848), 1848);

   // displays nothing :-(
   ShowMessage(pi.DriverName);
end;

  

Respond














 
Sign up to consume product discounts for Bronze memberships !

read more


  Visit our Sponsor

 

  Community Ad of
S. Kucherov
 
   














 







     
  Copyright © 2000 - 2007 delphi3000.com - All rights reserved. Terms of use. || Privacy
delphi3000.com is a service by bluestep.com IT-Services GmbH (Vienna)