Autor Beitrag
Lake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78


D6 prof., Delphi 10.2 Tokyo
BeitragVerfasst: Mi 21.06.17 11:33 
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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  ...
  Result := true;
  GetProfileString('Windows''device''', ResStr, 255);
  if (Trim(StrPas(ResStr)) = ''then
    result := false;
  ...


und mit:
ausblenden 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?

_________________
Gruss Lake
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.06.17 11:40 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Lake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78


D6 prof., Delphi 10.2 Tokyo
BeitragVerfasst: 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.

_________________
Gruss Lake
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 28.06.17 09:11 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Lake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78


D6 prof., Delphi 10.2 Tokyo
BeitragVerfasst: 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.

_________________
Gruss Lake
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.07.17 11:28 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62
Erhaltene Danke: 27

Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
BeitragVerfasst: Mi 05.07.17 11:56 
Hmm..

Teste mal:
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:
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.