AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EnumPrinters schlägt fehl

Ein Thema von Luckie · begonnen am 5. Jun 2006 · letzter Beitrag vom 6. Jun 2006
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

EnumPrinters schlägt fehl

  Alt 5. Jun 2006, 22:43
Ich versuche so alle lokalen Drucker zu bekommen:
Delphi-Quellcode:
procedure GetPrinters;
var
  dwNeeded : DWORD;
  dwReturn : DWORD;
  pinfo4 : PPrinterInfo4;
  pWork : PPrinterInfo4;
  i : Integer;
  s : string;
begin
  dwNeeded := 0;
  dwReturn := 0;
  EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, nil, 0, dwNeeded, dwReturn);
  GetMem(pinfo4, dwNeeded);
  try
    if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, PByte(pinfo4), sizeof(pinfo4), dwNeeded, dwReturn) then
    begin
      pWork := pinfo4;
      for i := 0 to dwReturn - 1 do
      begin
        s := string(pWork.pPrinterName);
        MessageBox(hApp, PChar(s), '', 0);
        Inc(pWork, sizeof(pWork));
      end;
    end
    else
      MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
  finally
    FreeMem(pinfo4);
  end;
end;
Aber leider schlägt EnumPrinters mit der Fehlermeldung:
Zitat:
Der an einen Systemaufruf übergebene Datenbereich ist zu klein
fehl. Was ich irgendwie nicht so ganz verstehe.

Anstatt sizeof(pinfo4) muss es natürlich dwNeeded heißen:
Delphi-Quellcode:
procedure GetPrinters;
var
  dwNeeded : DWORD;
  dwReturn : DWORD;
  pinfo4 : PPrinterInfo4;
  pWork : PPrinterInfo4;
  i : Integer;
  s : string;
begin
  dwNeeded := 0;
  dwReturn := 0;
  EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, nil, 0, dwNeeded, dwReturn);
  GetMem(pinfo4, dwNeeded);
  try
    if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, pinfo4, dwNeeded, dwNeeded, dwReturn) then
    begin
      pWork := pinfo4;
      for i := 0 to dwReturn - 1 do
      begin
        s := string(pWork.pPrinterName);
        MessageBox(hApp, PChar(s), '', 0);
        Inc(pWork);
      end;
    end
    else
      MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
  finally
    FreeMem(pinfo4);
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 12:28
Moin Michael,

also wenn ich Deinen Code per Copy&Paste in ein frisches Projekt eintrage, die Unit Winspool hinzufüge und dann mal hApp durch 0 austausche (sonst sehe ich die Messagebox nicht ) funktioniert das.

Kannst Du noch ein paar Angaben zum System machen?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 12:31
Oh, es ist wohl nicht deutlich geworden: Die zweite Funktion funktiobniert. Es lag daran, dass ich die falsche Größe übergheben hatte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 13:13
Ähem, ist die Frage damit geklärt? Es wird nämlich aus der Frage nicht richtig deutlich was du meinst und aus deiner Rückantwort an Christian nicht, ob sie beantwortet ist
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#5

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 13:45
Warum sehe ich denn nix wenn ich mir das in einem Memo anzeigen lassen will welche Printer hier drauf installiert sind mit

  Memo1.Lines.Add(GetPrinters); Wenn ich mit einem BP arbeite sehe ich in s aber die Printer.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 15:08
Sie IST beantwortet.

@Mackhack: Die Prozedur war noch nicht fertig. Wenn du, wie Christian hApp durch null ersetzte, siehst du immer eine Messagebox mit dem gefundenen Drucker. Hier der fertige Code:

Delphi-Quellcode:
TPrinterCallback = function(Printername: string): Boolean; stdcall;

// ...
// ...
// ...

function PrinterCallback(PrinterName: string): Boolean; stdcall;
begin
  SendDlgItemMessage(hApp, IDC_CB_PRINTERS, CB_ADDSTRING, 0, Integer(@Printername[1]));
  result := True;
end;

procedure GetPrinters(Callback: TPrinterCallback);
var
  dwNeeded : DWORD;
  dwReturn : DWORD;
  pinfo4 : PPrinterInfo4;
  pWork : PPrinterInfo4;
  i : Integer;
  s : string;
begin
  dwNeeded := 0;
  dwReturn := 0;
  EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, nil, 0, dwNeeded, dwReturn);
  GetMem(pinfo4, dwNeeded);
  try
    if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, pinfo4, dwNeeded, dwNeeded, dwReturn) then
    begin
      pWork := pinfo4;
      for i := 0 to dwReturn - 1 do
      begin
        s := string(pWork.pPrinterName);
        if not Callback(s) then
          break;
        Inc(pWork);
      end;
    end
    else
      MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
  finally
    FreeMem(pinfo4);
  end;
end;
Da ich das ganze ohne VCL läuft, ich daher keine StringListen zur Verfügung habe und ich auch das ganze nicht in eine Klasse gekapselt habe und somit keine Ereignisse habe, nutze ich die Funktionalität einer Callback Funktion. Du musst also entsprechend die Callback Funktion anpassen, wenn du es so nutzen willst. Ich würde es aber so umschreiben, dass entweder eine Stringliste mit den Druckern zurückgegeben wird oder aber es in eine Klasse kapseln und bei jedem Drucker ein Ereigniss auslösen oder so.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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