Autor |
Beitrag |
GuenterS
      
Beiträge: 23
D7 Pers
|
Verfasst: Di 17.08.04 09:09
Hallo,
ich habe die Procedure
Delphi-Quelltext 1:
| function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall; external 'winspool.drv' name 'GetDefaultPrinterA'; |
eingebunden, weiß aber nicht so recht wie ich sie verwenden soll/kann.
Momentan habe ich folgenden Ansatz:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function getDefaultPrinterName:string; var lprnName: PAnsiChar; lBufSize: DWord; begin GetMem(lprnName, 1000); try GetDefaultPrinterA(lprnName, lBufSize); Result := lprnName; finally FreeMem(lprnName); end; end; |
Wobei ich mich frage wieviel Speicher muss ich reservieren oder macht das die Funktion für mich?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 17.08.04 12:00
Ähh Moment, du übergibst buffersize, damit dir die Prozedur reinschreibt wie viele Bytes geschrieben wurden.
Ich kenn jetzt die Prozedur nicht, aber es kann sein, dass du die einmal mit 0 aufrufen musst, damit sie dir sagt, wieviel du reservieren musst, und dann mit dem entsprechend allocierten Speicher den richtigen Aufruf machen musst.
Ansonsten:
Wie wärs mit Printer aus der Unit Printers? Die macht dir das ganze etwas einfacher...
|
|
GuenterS 
      
Beiträge: 23
D7 Pers
|
Verfasst: Di 17.08.04 12:57
Also Du meinst ich solle es folgendermaßen machen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function getDefaultPrinterName:string; var lprnName: PAnsiChar; lBufSize: DWord; begin lBufSize := 0; GetDefaultPrinterA(lprnName, lBufSize); GetMem(lprnName, lBufSize); try GetDefaultPrinterA(lprnName, lBufSize); Result := lprnName; finally FreeMem(lprnName); end; end; |
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 17.08.04 13:39
Wenn du Null als Puffergröße übergibst, ist das Rückgabeergebnis der Funktion Null, und "GetLastError" liefert einen Fehlercode zurück. Entweder ERROR_INSUFFICIENT_BUFFER (der Puffer ist zu klein, in dem Fall enthält "lBufSize" die benötigte Größe) oder ERROR_FILE_NOT_FOUND (es gibt keinen Standarddrucker). Nachzulesen im MSDN.
Sprich: So wie du es überlegt hast, ist das grundsätzlich in Ordnung.
|
|
GuenterS 
      
Beiträge: 23
D7 Pers
|
Verfasst: Di 17.08.04 14:39
demnach wäre folgende Funktion Informativer.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function getDefaultPrinterName(var APrinterName:string):boolean; var lprnName: PAnsiChar; lBufSize: DWord; begin APrinterName := ''; Result := true; lBufSize := 0; GetDefaultPrinterA(lprnName, lBufSize); if (GetLastError = ERROR_FILE_NOT_FOUND) then Result := false else begin GetMem(lprnName, lBufSize); try GetDefaultPrinterA(lprnName, lBufSize); APrinterName := lprnName; finally FreeMem(lprnName); end; end; end; |
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 17.08.04 16:10
Hast du was gegen den einfachen Weg?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function GetDefaultPrinterName: string; var lprnName : pchar; lBufSize : dword; begin Result := ''; lBufSize := 0;
GetDefaultPrinter(nil,lBufSize); if(GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin GetMem(lprnName,lBufsize); try if(GetDefaultPrinter(lprnName,lBufSize)) and (lprnName[0] <> #0) then SetString(Result,lprnName,lstrlen(lprnName)); finally FreeMem(lprnName); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetDefaultPrinterName); end; |
Zu sagen wäre allerdings noch, dass es die Funktion "GetDefaultPrinter" erst ab Windows 2000 und höher gibt. Wenn dein Programm evtl. aber auch auf älteren OS-Versionen zum Einsatz kommt (und wenn es der berühmte Zufall ist, dass ein 98-User dein Programm irgendwie in die Hände bekommt), dann solltest du dir eine Alternative überlegen.
Mir fällt da im Moment bloß die API-Funktion "EnumPrinters" ein, bzw. die schon oben erwähnte Unit "Printers".
|
|
GuenterS 
      
Beiträge: 23
D7 Pers
|
Verfasst: Di 17.08.04 16:17
Nun ja, zugegebener Maßen habe ich mein Problem in der Tat mit der Printers Unit gelöst (Printer.PrinterIndex).
Allerdings zu dem Zeitpunkt wo ich meine Fragen im Delphi-Forum und in der Delphi-Praxis gestellt habe, wußte ich noch nichts von dieser doch so einfachen Lösung und hatte nur diese eine Methode.
Ich wollte aber nicht die Frage einfach so als beantwortet markieren, mit einer Lösung die eigentlich nicht die Frage aus dem Posting löst. So haben vielleicht auch andere noch etwas davon.
|
|