Entwickler-Ecke
Windows API - Wie kriege ich den DefaultPrinter?
GuenterS - Di 17.08.04 09:09
Titel: Wie kriege ich den DefaultPrinter?
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 - 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 - 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; |
Delete - 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 - 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; |
Delete - 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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!