![]() |
Serverzugriff aus Service
Hallo zusammen
Ich versuche auf eine dll zuzugreifen, mit dieser kann ich auf Tags(Variablen) zugreifen. Diese Tags liegen auf einem DXS-Server. Dies funktioniert auch:
Delphi-Quellcode:
Jetzt möchte ich aber das ganze als Service laufen lassen...
procedure TForm1.Button1Click(Sender: TObject);
begin TagsObj := TTags.create(self); TagsObj.Connect; Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0); Control_0.Value := 4000; end;
Delphi-Quellcode:
Hier kommt aber immer das Problem:
procedure TService1.ServiceExecute(Sender: TService);
begin TagsObj := TTags.create(self); TagsObj.Connect; Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0); Control_0.Value := 4000; end; Kurz nach dem Start des Service wird die Fehlermeldung: Zitat:
Aus dieser wird ich aber nicht wirklich Schlau, denn diese zeigt es mir bei allen möglichen Fehlern in einem Service an. Da der Code schlussendlich gleich ist, kann es nur daran liegen, dass ich beim Befehl:
Delphi-Quellcode:
liegt. Denn hier ist der unterschied das ich beim Service den Service als self weitergebe und bei der Formanwendung die Form.
TagsObj := TTags.create(self);
Weiss jemand was ich dann beim Service anders mitgeben soll antstatt "self"? Oder ist es ein ganz anderes Problem? |
Re: Serverzugriff aus Service
Zitat:
der Service ist kein Formular, also bei self in jedem Fall falsch. Falls Create den Parameter als Parent braucht (kann man aus den Schnipseln nicht entnehmen), wirst du wohl oder übel alles so umschreiben müssen, dass keine VCL-Teile mehr gebraucht werden. Ausserdem hat der Service natürlich nicht den Account des Users, weil da gar kein User ist - der Service kann also u.U. nicht auf Daten auf dem Server zugreifen. Dazu muss man ihm erst die Rechte geben. Gruss Reinhard |
Re: Serverzugriff aus Service
Tönt einleuchtend, aber wie kann ich einem Service das Recht geben auf den Server zuzugreifen?
|
Re: Serverzugriff aus Service
Zitat:
ohne weiteres läuft der Service unter dem Systemaccount, d.h. er darf viel auf dem eigenen Rechner und praktisch nichts im Netz. Das ist sozusagen der Standardfehler aller Serviceentwickler-Anfänger. Man kann aber den Service unter einem anderen Account starten, der die nötigen Rechte hat. Das entspricht "Ausführen als". Viele Entwickler legen der Übersichtlichkeit halber gleich einen speziellen Benutzeraccount für den Service an, der dann z.B. für einen Faxserver auch einen passenden Namen haben sollte, dann sieht das jeder Admin gleich. Gruss Reinhard |
Re: Serverzugriff aus Service
Moin Reinhard,
Zitat:
Unter Umständen kann das dann auch zu Programmänderungen führen, falls man Zugriffe benutzt hat, die für die eigentliche Funktionalität nicht notwendig wären (z.B. irgendetwas mit Schreib-/Lesezugriff öffnen, wo lesen genügt). |
Re: Serverzugriff aus Service
Ich führe den Service jetzt mit meinem Benutzerkonto aus. Hier bringt der Service zwar keine Fehlermeldung, jedoch macht er auch gar nichts. Er bringt nicht einmal die eingebaute Messagebox, obwohl "Interaktive" auf true ist.
Delphi-Quellcode:
Stimmt das eigenlich, dass man während des ausführen des Services sich nur im Execute teil befindet? Und somit eigenlich nur Sequenziel programmieren kann?
procedure TService1.ServiceExecute(Sender: TService);
begin ShowMessage('test'); //Diese MessageBox wird gar nicht angezeigt TagsObj := TTags.create(self); TagsObj.Connect; Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0); Control_0.Value := 4000; end; |
Re: Serverzugriff aus Service
Zitat:
Wenn ja, ist es nicht möglich direkt aus dem Service heraus eine UI-Element aufzurufen. In diesem Fall muss man einen Umweg über ein weiteres Programm gehen, daß von dem Service aufgerufen wird und welches dann das UI-Element aufruft. |
Re: Serverzugriff aus Service
Zitat:
|
Re: Serverzugriff aus Service
Die Meldung, dass der Dienst angehalten wurde kommt daher, dass deine Execute Methode ja sofort wieder beendet wird. Die Methode ist genau dieselbe, wie eine Threadmethode. Der Thread wird zerstört sobald die End; Zeile abgearbeitet wurde.
Man kann eine Nachrichtenbox ausgeben lassen, indem man MessageBox der WinAPI verwendet und MB_SERVICENOTIFICATION verwendet. Oder man macht es eben über ein extra Programm. Jedoch ist ab XP und Win2003 das Problem, welcher Benutzer die Nachricht sehen soll. Schließlich können mehrere Benutzer gleichzeitig eingeloggt sein, siehe Terminal Services. Wenn du deinen Dienst unter einem normalen Benutzer laufen lässt, dann ist das ok, sofern der Benutzer kein Administrator ist. Das verhindert, dass Fehler in deinem Programm, es anderen Benutzern ermöglicht Dinge zu machen, die sie eigentlich nicht dürften. Du solltest daher die Ausführung unter dem Dienst Konto verweigern (GetUserName = 'SYSTEM'). |
Re: Serverzugriff aus Service
Zitat:
Zitat:
Zitat:
Den letzten Absatz habe ich nicht ganz verstanden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz