Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Delphi Infos über Drucker abfragen (https://www.delphipraxis.net/54192-infos-ueber-drucker-abfragen.html)

shmia 29. Sep 2005 13:32


Infos über Drucker abfragen
 
mit folgenden Prozeduren kann man relativ umfangreiche Informationen über einen Drucker abfragen.
Die Info's werden aus dem PrinterInfo2 Record in einen eigenen Record kopiert, damit man bequem die Daten auslesen kann.
(Der PrinterInfo2 Record enthält Zeiger, die auf Müll zeigen, sobald das Printer-Handle geschlossen wird. Deshalb das Umkopieren)
Delphi-Quellcode:
interface
Uses Windows;
type
  TPrinterInfo2Easy = record
    ServerName: string;
    PrinterName: string;
    ShareName: string;
    PortName: string;
    DriverName: string;
    Comment: string;
    Location: string;
    SepFile: string;
    PrintProcessor: string;
    Datatype: string;
    Parameters: string;
    Attributes: DWORD;
    Priority: DWORD;
    DefaultPriority: DWORD;
    StartTime: DWORD;
    UntilTime: DWORD;
    Status: DWORD;
    cJobs: DWORD;
    AveragePPM: DWORD;

    DevMode : TDeviceModeA;
//    SecurityDescriptor : TSecurityDescriptor;
  end;

procedure GetPrinterInfo2(hPrinter: HDC; var Info: TPrinterInfo2Easy); overload;
procedure GetPrinterInfo2(const pname: string; var Info: TPrinterInfo2Easy); overload;

implementation

Uses SysUtils;

// local helper procdure
procedure PrinterErrCheck(v: Boolean);
begin
  if not v then
    raise EPrinter.Create(SysErrorMessage(GetLastError));
end;



procedure GetPrinterInfo2(hPrinter: HDC; var Info: TPrinterInfo2Easy); overload;
var
  hGlobal : THandle;
  PPI2     : PPrinterInfo2;
  dwNeeded : DWORD;
begin
  GetPrinter(hPrinter, 2, Nil, 0, @dwNeeded);

//ShowMessage('Needed:'+IntToStr(dwNeeded)+' '+IntToStr(SizeOf(TPrinterInfo2)));

  hGlobal := GlobalAlloc(GHND, dwNeeded);
  try
    PPI2 := PPrinterInfo2(GlobalLock(hGlobal));

    PrinterErrCheck( GetPrinter(hPrinter, 2, PPI2, dwNeeded, @dwNeeded));

    Info.ServerName := PPI2^.pServerName;
    Info.PrinterName := PPI2^.pPrinterName;
    Info.ShareName  := PPI2^.pShareName;
    Info.PortName   := PPI2^.pPortName;
    Info.DriverName := PPI2^.pDriverName;
    Info.Comment    := PPI2^.pComment;
    Info.Location   := PPI2^.pLocation;
    Info.SepFile    := PPI2^.pSepFile;
    Info.PrintProcessor := PPI2^.pPrintProcessor;
    Info.Datatype   := PPI2^.pDatatype;
    Info.Parameters := PPI2^.pParameters;
    Info.Attributes := PPI2^.Attributes;
    Info.Priority   := PPI2^.Priority;
    Info.DefaultPriority := PPI2^.DefaultPriority;
    Info.StartTime  := PPI2^.StartTime;
    Info.UntilTime  := PPI2^.UntilTime;
    Info.Status     := PPI2^.Status;
    Info.cJobs      := PPI2^.cJobs;
    Info.AveragePPM := PPI2^.AveragePPM;

      // folgender Move führt auf manchen Rechnern zu einer Zugriffverletzung
//  Move(PPI2^.pDevMode^, Info.DevMode, sizeof(Info.DevMode));
//  Info.SecurityDescriptor

  finally
    GlobalUnlock(hGlobal);
    GlobalFree(hGlobal);
  end;
end;

procedure GetPrinterInfo2(const pname: string; var Info: TPrinterInfo2Easy); overload;
var
  hPrinter : THandle;
  PD      : TPrinterDefaults;
begin
  FillChar(PD, SizeOf(PD), 0);
  PD.DesiredAccess := PRINTER_READ; // 
  PrinterErrCheck( OpenPrinter(PChar(pname), hPrinter, @PD));
  try
    GetPrinterInfo2(hPrinter, Info);
  finally
    ClosePrinter(hPrinter);
  end;
end;
[edit=Chakotay1308]Styleguide. Mfg, Chakotay1308[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz