Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Druckdienst (https://www.delphipraxis.net/161888-druckdienst.html)

gravedigger 26. Jul 2011 10:20

Druckdienst
 
Hallo DPler,

ich habe einen Dienst geschrieben der Daten über TCP empfängt und dann auf verschiedene Netzwerkdrucker ausdruckt (je nach Daten).
Der Dienst läuft als Systemuser und das Problem mit dem Standarddrucker des Systemusers habe ich mit einem Registryeintrag gelöst.
Alles funktioniert solange hervorragend, bis der Server neu gebootet wird (Windowsupdates etc.), dann hagelt es bei jedem Datensatz eine Exception (Zugriffsverletzung bei Adresse XXXXXXXX in Modul 'ServiceName.exe'. Lesen von Adresse 00000000).

Um den richtigen Drucker einzustellen verwende ich folgenden Code:
Code:
Printer.PrinterIndex := Printers.IndexOf(Druckername);
und sobald ich auf die Druckerliste (Printers) zugreifen will kommt die Exception.
Wenn ich den Dienst dann beende und neu starte funktioniert auch alles, aber das ist ja nicht der Sinn und Zweck eines Dienstes.
Ich vermute das ich irgendwelche Abhängigkeiten für den Dienst einstellen muß, nur welche?.
Spooler habe ich schon versucht, war's nicht.

Hat irgendwer noch 'ne Idee?

Gruß aus dem regnerischen Dortmund
Frank

jf_stgt 26. Jul 2011 10:37

AW: Druckdienst
 
Dein Problem könnte sein, dass der Druckerdienst noch nicht (fertig) geladen ist sobald Dein Dienst startet.
Kannst Du bei dir mal ein Sleep(...) oder was zum Test einbauen.
z.B: Den Namen des Druckdienstes (müsste man nachschauen) auf Start abprüfen?!
Ist jetzt nur so ne Vermutung. Ich hatte auch mal ein Problem mit der Reihenfolge von Windows Diensten.

Gruß
Jürgen

Bernhard Geyer 26. Jul 2011 10:39

AW: Druckdienst
 
Ergänz mal die Abhängikeite das dein Dienst erst nach dem Druckerdienst startet.

gravedigger 26. Jul 2011 10:44

AW: Druckdienst
 
Hallo jf_stgt,

wie schon in meinem ersten Posting geschrieben eine Abhängigkeit (dependency) zu Spooler (spoolsv.exe) habe ich schon ausprobiert, hat aber auch nicht geholfen.

Gruß
Frank

jf_stgt 26. Jul 2011 13:28

AW: Druckdienst
 
Es scheint also irgendeine Abhängigkeit zu geben.
Du könntest zu Testzwecken einen Timer aufziehen, dort Deinen Code ausführen und in einem try finally Block schützen.
Wenn es schiefgeht, startest Du den Timer in 1 s wieder.
Nach ein paar Sekunden/Minuten sollte es ja dann irgendwann mal gehen.
Dann kannst Du im Windows Ereignismonitor schauen welcher Dienst wann gestartet wurde und die siehst mit viel Glück Deine Abhängigkeit.

Gruß
Jürgen

gravedigger 29. Jul 2011 20:12

AW: Druckdienst
 
Hallo DPler,

und da bin ich wieder, immer noch mit dem gleichem Problem. Aber mit neuen Erkenntnissen.
  1. Die Druckerliste mit EnumPrinters selber holen, funktioniert auch nicht.
  2. Habe mir aus der Registry die Reihenfolge der Dienste geholt und den letzten genommen und als Abhängigkeit hinzugefügt, das gleiche Ergebnis.
  3. In einem anderen Dienst (anderer Rechner, anderes OS) funktioniert es. Also Unterschiede gesucht, angepasst, geht auch nicht.
... und noch ein paar andere Versuche die alle nichts gebracht haben.

Könnte es vielleicht daran liegen, dass das ganze unter W2k8 läuft (der funktionierende Dienst läuft unter XP) oder liegt es daran, dass das ein Server ist und der eigentlich nur "servt" d. h. kein aktiver Benutzer angemeldet ist (s.ä. wie der nicht vorhandene Standarddruckerdes Systemusers)? Wenn ich mich ja als Admin anmelde um den Dienst neu zu starten funktioniert es ja, aber wie installiert man beim Systemuser einen Drucker!

Vielleicht doch noch jemand eine Idee.

Grüße diesmal aus Kamen
Frank

rollstuhlfahrer 29. Jul 2011 23:33

AW: Druckdienst
 
Zitat:

Zitat von gravedigger (Beitrag 1114175)
Wenn ich mich ja als Admin anmelde um den Dienst neu zu starten funktioniert es ja, aber wie installiert man beim Systemuser einen Drucker!

Ganz einfach: Man trickst die Windows-Anmeldung aus und meldet sich dann als System an.

Jetzt wieder zum ernsten Bereich: Dein Dienst muss nicht als System starten. Du kannst auch einen neunen Benutzer dafür anlegen. Mit diesem kannst du dich dann auch anmelden und die entsprechenden Grundlagen schaffen. Dies ist auch dahingehend besser, dass du ein gewisses Sicherheitskonzept umsetzen kannst, was dem System-User absolut verwehrt bleibt (er muss ja alle Rechte haben).


Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz