Autor Beitrag
GuenterS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23


D7 Pers
BeitragVerfasst: Di 17.08.04 09:09 
Hallo,

ich habe die Procedure


ausblenden Delphi-Quelltext
1:
function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcallexternal 'winspool.drv' name 'GetDefaultPrinterA';					


eingebunden, weiß aber nicht so recht wie ich sie verwenden soll/kann.

Momentan habe ich folgenden Ansatz:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23


D7 Pers
BeitragVerfasst: Di 17.08.04 12:57 
Also Du meinst ich solle es folgendermaßen machen?

ausblenden 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



BeitragVerfasst: 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 Suche im MSDN MSDN.

Sprich: So wie du es überlegt hast, ist das grundsätzlich in Ordnung.
GuenterS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23


D7 Pers
BeitragVerfasst: Di 17.08.04 14:39 
demnach wäre folgende Funktion Informativer.

ausblenden 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



BeitragVerfasst: Di 17.08.04 16:10 
Hast du was gegen den einfachen Weg? ;)
ausblenden 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] <> #0then
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23


D7 Pers
BeitragVerfasst: 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.