Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Drucker auslesen (Systemsteuerung --> Drucker & Faxgeräte) (https://www.delphipraxis.net/107289-drucker-auslesen-systemsteuerung-drucker-faxgeraete.html)

Andidreas 25. Jan 2008 09:57


Drucker auslesen (Systemsteuerung --> Drucker & Faxge
 
aloha zusammen,


kann man mit delphi die drucker auslesen die man sich unter "Systemsteuerung --> Drucker und Faxgeräte" hinzugefügt hat irgendwie in eine listbox oder ähnliches auslesen?

shmia 25. Jan 2008 10:13

Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Delphi-Quellcode:
Listbox1.items.Assign(Printer.Printers);
Weitere Infos zum einzelnen Drucker gibt es hier:
http://www.delphipraxis.net/internal...ct.php?t=64627

Andidreas 25. Jan 2008 11:47

Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
ah cool, dankeschön...

werd ich mal ausprobieren :)

Micha-Z 24. Nov 2009 09:48

Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Hallo Delphi-Praxis-Gemeinde,

bin gerade dabei mit Delphi zu experimentieren und bräuchte etwas Hilfe.
Ich würde gern die installierten Drucker ( z.B. auf einen Server ) in
mein kleines Programm einlesen. Nun hatte ich diesen Fred hier gelesen
und komme damit aber nicht wirklich weiter. Eigentlich bräuchte ich nur
den Namen und die dazugehörige IP. Und diese Daten dann in einem Arry.

Listbox1.items.Assign(Printer.Printers); ist da ja zu wenig. Und der
andere Link hier ist wieder etwas zu umfangreich.

..... HILfe :roteyes:

GRuß
Micha

RWarnecke 24. Nov 2009 10:11

Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Hallo Micha,

schaue Dir mal meine Komponente TPrinterInfo an. Damit kannst Du fast alles auslesen, was in dem Fenster Drucker & Faxgeräte angezeigt wird.
Sollte etwas fehlen, dann melde Dich einfach oder füge es hinzu und sende mir eine Kopie der neuen Fassung zu.

Micha-Z 9. Dez 2009 19:42

Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Hallo RWarnecke

vielen Dank erst mal,
schau mir das gerne an!

GRuß
Micha

hsg 27. Jul 2010 08:17

AW: Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Hallo,

Zitat:

Zitat von RWarnecke (Beitrag 973741)
Hallo Micha,

schaue Dir mal meine Komponente TPrinterInfo an. Damit kannst Du fast alles auslesen, was in dem Fenster Drucker & Faxgeräte angezeigt wird.
Sollte etwas fehlen, dann melde Dich einfach oder füge es hinzu und sende mir eine Kopie der neuen Fassung zu.

ich habe sie jetzt auf einem Windows 2008-Server ausprobiert. Leider knallt es beim Auslesen der PPRinterInfo2 -Struktur :( ( FPrinterListName.Add(PPrinter^.pPrinterName); // Zeile 528 in GetPrinterListName)

Was kann das sein? (Auf einem XP-Rechner funktioniert es!)

sx2008 27. Jul 2010 08:54

AW: Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Zitat:

Zitat von hsg (Beitrag 1037797)
Leider knallt es beim Auslesen der PPRinterInfo2 -Struktur :( ( FPrinterListName.Add(PPrinter^.pPrinterName); // Zeile 528 in GetPrinterListName)
Was kann das sein? (Auf einem XP-Rechner funktioniert es!)

Da ist wohl ein Bug in folgender Methode (und auch anderen Methoden)
Erklärung:
Es wird ein neuer Record von PPrinterInfo2 im Speicher angelegt,
dann werden alle Daten aus dem Speicherblock Buffer übertragen
und dann wird der Record an die Liste FAllInfos angehängt.

Das ist die Idee hinter dem Code.
In Wirklichkeit werden hier aber keine Daten kopiert, sondern hauptsächlich Zeiger.
Und die Zeiger zeigen direkt in den Buffer hinein.
Mit dem letzten Befehl FreeMem(Buffer); wird der Puffer allerdings freigegeben
und die Zeiger verweisen auf freigegebenen Speicher.

Es hängt vom Zufall ab, wie lange es dauert bis es eine Zugriffsverletzung gibt.

Delphi-Quellcode:
procedure TPrinterCustom.GetAllPrinterInfos;
var
  pcbNeeded : DWORD;
  pcReturned : DWORD;
  Buffer    : PChar;
  PrinterInfo: PChar;
  I         : Integer;
  PPrinter  : PPrinterInfo2;
  Flags     : DWORD;
  Level     : Byte;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
    Level := 2;
  end
  else
  begin
    Flags := PRINTER_ENUM_LOCAL;
    Level := 2;
  end;
  EnumPrinters(Flags, nil, Level, nil, 0, pcbNeeded, pcReturned);
  GetMem(Buffer, pcbNeeded);
  EnumPrinters(Flags, nil, Level, PByte(Buffer), pcbNeeded, pcbNeeded, pcReturned);
  PrinterInfo := Buffer;
  for I := 0 to pcReturned - 1 do
  begin
    New(PPrinter);
    with PPrinterInfo2(PrinterInfo)^ do
    begin
      PPrinter^.pServerName    := pServerName; // kopiere PChar-Zeiger
      PPrinter^.pPrinterName   := pPrinterName; // dito
      PPrinter^.pShareName     := pShareName;  // ...
      PPrinter^.pPortName      := pPortName;
      PPrinter^.pDriverName    := pDriverName;
      PPrinter^.pComment       := pComment;
      PPrinter^.pLocation      := pLocation;
      PPrinter^.pSepFile       := pSepFile;
      PPrinter^.pPrintProcessor := pPrintProcessor;
      PPrinter^.pDatatype      := pDatatype;
      PPrinter^.pParameters    := pParameters;
      PPrinter^.Attributes     := Attributes;
      PPrinter^.Priority       := Priority;
      PPrinter^.DefaultPriority := DefaultPriority;
      PPrinter^.StartTime      := StartTime;
      PPrinter^.UntilTime      := UntilTime;
      PPrinter^.Status         := Status;
      PPrinter^.cJobs          := cJobs;
      PPrinter^.AveragePPM     := AveragePPM;
      FAllInfos.Add(Pointer(PPrinter));
      Inc(PrinterInfo, SizeOf(TPrinterInfo2));
    end;
  end;
  FreeMem(Buffer);
end;

hsg 27. Jul 2010 09:46

AW: Re: Drucker auslesen (Systemsteuerung --> Drucker & F
 
Hallo,

Zitat:

Zitat von sx2008 (Beitrag 1037805)
Mit dem letzten Befehl FreeMem(Buffer); wird der Puffer allerdings freigegeben
und die Zeiger verweisen auf freigegebenen Speicher.

Es hängt vom Zufall ab, wie lange es dauert bis es eine Zugriffsverletzung gibt.

Du hast Recht. Was dort geschieht, war mir schon klar (habe nur das FreeMem am Ende der Routine übersehen). Funktioniert jetzt für mich (mit Speicherleck, aber das interessiert mich in meinem speziellen Fall nicht, weil das Programm nur 1x mal aufgerufen und danach nie wieder benötigt wird)

Danke!
Jörg


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 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