Entwickler-Ecke

Sonstiges (Delphi) - Meldung: Zur Zeit ist kein Standarddrucker gewählt


Lake - Mi 21.06.17 11:33
Titel: Meldung: Zur Zeit ist kein Standarddrucker gewählt
Hallo,

bei mehreren Programmen habe ich folgenden Effekt.
Wenn ich eines der Programm starte erhalte ich ab und zu folgende Fehlermeldung:

Exception EPrinter in Modul Programm.exe bei 00040533
Zur Zeit ist kein Standarddrucker gewählt.


Nun soll das Programms nicht gestartet werden wenn "kein Standarddrucker" vorhanden ist.
Also wenn Standarddrucker vorhanden Programm starten, sonst nicht.

Dies versuche beim Programmstart mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  ...
  Application.Initialize;
  if PruefeStandardDrucker then
  begin
    ...
    Application.Run;
  end// PruefeStandardDrucker


Die Pruefung des Standardrucker wird nach Recherchen im Netz mit diesen beiden Methoden probiert.

Function PruefeStandardDrucker : Boolean;

einmal mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  ...
  Result := true;
  GetProfileString('Windows''device''', ResStr, 255);
  if (Trim(StrPas(ResStr)) = ''then
    result := false;
  ...


und mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 
  ...
  Result := true;
  if not EnumPrinters(PRINTER_ENUM_DEFAULT, nil5nil0, ByteCnt,
  StructCnt) and (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
  begin
    bRueck := false;
  end;
  ...


Beides führt nicht zum Erfolg, es erscheint trotzdem dann die Fehlermeldung.

Wie kann ich einen Programmstart verhindern, wenn kein Standarddrucker vorhanden ist?


Delete - Mi 21.06.17 11:40

- Nachträglich durch die Entwickler-Ecke gelöscht -


Lake - Mi 28.06.17 07:43

Hallo Frühlingsrolle,

vielen Dank für den Tip.

Das ist eine gute Lösung wenn der Druckername bekannt ist.
Aber sobald das Programm auf einem anderen Rechner gestartet wird geht das nicht mehr, da der abgefragte Drucker nicht auf dem anderen System vorhanden ist.


Delete - Mi 28.06.17 09:11

- Nachträglich durch die Entwickler-Ecke gelöscht -


Lake - Mi 05.07.17 08:00

Guten Morgen Frühlingsrolle,

vielen Dank auch für diesen Tip.

Nur zur Info, heute wurde trotz dieser Anpassung derselbe Fehler erzeugt.


Delete - Mi 05.07.17 11:28

- Nachträglich durch die Entwickler-Ecke gelöscht -


Holgerx - Mi 05.07.17 11:56

Hmm..

Teste mal:

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:
function GetDefaultPrinterW(prnName : PWideChar; var bufSize : DWORD ) : BOOL; stdcallexternal 'winspool.drv' name 'GetDefaultPrinterW';


function GetDefaultPrinterName: WideString;
var
  lprnName : PWideChar;
  lBufSize : dword;
begin
  Result   := '';
  lBufSize := 0;

  GetDefaultPrinterW(nil,lBufSize);
  if(GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    GetMem(lprnName,(lBufsize * SizeOf(WideChar)));
    try
      if(GetDefaultPrinterW(lprnName,lBufSize)) and
        (lprnName[0] <> #0then
      Result := lprnName;
    finally
      FreeMem(lprnName);
    end;
  end;
end;


Ab Windows 2000 wird mit 'GetDefaultPrinter' der Standard-Drucker zurück geliefert.
Dann musst Du nur noch prüfen, ob der String leer ist ;)

Die EnumPrinters ist lt. MS für die Ermittlung des Standard-Druckers nicht mehr zuständig.