Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Applikation als NT Service (System Dienst) unter XP starten (https://www.delphipraxis.net/3702-applikation-als-nt-service-system-dienst-unter-xp-starten.html)

xpmstos 26. Mär 2003 10:09


Applikation als NT Service (System Dienst) unter XP starten
 
Guten Tag,

ich habe eine Sache vor ohne dafür das nötige Wissen mitzubringen. Und zwar möchte ich auf Windows XP eine Applikation als NT Service (System Dienst) laufen lassen. Allerdings hab ich bis jetzt noch nicht herausbekommen wie man eine *.exe als Service einträgt. Gibt es direkt von Microsoft Informationen dazu?

Mit freundlichen Grüßen

xpmstos

sakura 26. Mär 2003 10:13

Welche Delphi Version nutzt Du genau? Die meisten haben im Menu Datei|Neu die Auswahl für eine System-Service Anwendung.

Eine normale Applikation kann nicht als NT-Service gestartet werden.

...:cat:...

xpmstos 26. Mär 2003 10:19

Ich nutzte Delphi 6 Personal Englisch. Kann ich irgendwo noch genauere Informationen über die Version entnehmen, oder reicht dir diese Info aus?
Ich habe mir das gerade mal angeschaut, aber ich finde soetwas wie "System Service" nicht.
Wenn ich mir eine neue Version organisieren muss, welche bietet dies an?

Mit freundlichen Grüßen

xpmstos

Luckie 26. Mär 2003 10:38

Bei der Personal habe ich es noch nicht gefunden. Du mußt es also von Hand über die API machen. Auf www.assarbad.org gibt es ein Tutorial, allerdings müßtest du dich bis zum Wochenende gedulden, dann will er seine richtige Seite wieder online stellen. (Beschwerden bitte an Bush / c/o Whitehouse schicken. :wink:)

xpmstos 26. Mär 2003 10:42

dankeschön, ich werde dann an anderen stellen weitermachen und abwarten bis die seite wieder online ist.

Mit freundlichen Grüßen

xpmstos

xpmstos 8. Apr 2003 15:57

Hab es geschafft auf Delphi 7 Enterprise Deutsch umzusteigen.
Dort hab ich dann eine Servie-Anwendung erstellt und diese so leer wie sie war compiliert und wollte in der Verwaltung (Win XP Prof) nachschauen wo er den ist. Allerdings ist die Anwendung nur wenig sekunden aktiv gewesen und ist dann einfach so beendet.

1. Hat das was zu sagen?
2. Kann ich in der Service-Anwendung auch sichtbare Frames mit einbauen?
3. Kann ich den Service (auf Win XP Home) so eintragen, das er nur bei einer bestimmten Benutztergruppe (oder einzelnen Benutzter) automatisch gestartet wird?

Mit freundlichen Grüßen

xpmstos

magicshadow 17. Mai 2003 10:20

ich hab ein ähnliches Problem!
Wenn ich das Tut von asserbad verwende um einen service zu starten dann funst das nur bei comandozeilen basierten Programmen, kann ich das so umschreiben, dass es auch bei Programmen mit VCL komponenten funktioniert (also das diese weiterhin arbeiten)?

Wenn nicht, kann mir jemand erklären, wie ich diese Serviceanwendung mit VCL komponenten nutzen kann?

Wäre super!
THX schonmal

sakura 17. Mai 2003 11:01

Ich habe in folgendem Thread eine Unit gepostet, welche alle nötigen NT-Routines unterstützt.

...:cat:...

P.S.: In Zukunft für eigene Probleme bitte einen neuen Thread eröffnen. :warn:

magicshadow 17. Mai 2003 11:19

ich mag blind, doer unausgeschlafen sein, aber welchen Threat meinst du?

Sorry, aber ich dachte das Problem ist ungefähr das gleiche udn passt deshalb hierhinein, werd mich bessern :oops:

sakura 17. Mai 2003 11:21

Öhm, :oops:

http://www.delphipraxis.net/viewtopic.php?t=3970

...:cat:...

magicshadow 17. Mai 2003 11:29

mhmm, wenn ich das richtig sehe kann ich mit dieser unit zwar andere Dienste steuern, aber mein Problem ist damit immer noch nicht gelößt, ich möchte ja meine eigene Anwendung so als Dienst laufen lassen, das ich auf die VCL komponenten (spez. TFTPServer, TPopupMenue und Timer) zugreifen kann.

Captnemo 17. Mai 2003 12:45

D7:

Datei - Neu - Weitere.. - Service-Anwendung.

Dann hast du eine Unit Service1. Dort kannst du dann dein procedures und functions, und alle nicht Visuellen Komponenten verwenden. Also dein Code schreiben.

Du kannst auch Formen verwenden, dann mußt du aber die Eigenschaft "Interactive" vom Service auf True setzen. Unter "Display-Name" trägst du den Namen ein, der unter dem Dienstmanager von NT erscheinen soll.

Anschließend Compilieren, nicht Starten.

DOS-Fenster öffnen, dann PFAD\PROG.exe -install eingeben. Danach ist dein Dienst unter NT vorhanden. "net start Dienstname" startet deinen Dienst, "net stop Dienstname" stoppt ihn wieder.
Mit PFAD\PROG.exe -uninstall entfernst du ihn wieder.

Das debuggen ist da schon etwas aufwendiger. Man kann sich zwar mit Diensten aus der IDE Verbinden, aber ich erzeuge mir immer Log-Dateien, schreibe mir die Werte da hinein, und werte das Ganze anschließend aus.

Noch Fragen ?

magicshadow 17. Mai 2003 15:00

Hätte noch eine frage!
Gibt es ne möglichkeit einen Service zu schreiben, dass er als service und als normales Program funktioniert?
Also das es auch funktioniert, wenn es nicht installiert ist und ich die exe normal starte?

Captnemo 17. Mai 2003 15:06

Geht bestimmt. Ich weiß aber nicht wie. Würd mich aber auch brennend interessieren. :mrgreen: :mrgreen:

Chewie 17. Mai 2003 15:16

Machs doch wie beim Apache.
Ohne Parameter starten -> normaler Betrieb
Mit best. Parametern starten -> Installation/Start als Service

magicshadow 17. Mai 2003 15:24

und wie erkläre ich ihm, dass er bei normalem betrieb normal starten soll?

Also ich hab mal ein bissle rumprobiert, und wenn ich in die eigenschaft onExecute ne

Code:
server.start;
while laufe do begin
sleep(1);
application.ProcessMessages;
end;
setze wird beim normalen ausführen einafch diese endlosschleife ausgeführt, das heißt er beendet nicht, erst wenn die variable laufe auf false gesetzt wird geht er aus der schleife und beendet dadurch die anwendung. Müßte man nur noch abfangen, ob bestimte parameter gesendet wurden und irgendwie prüfen, ob normal ausgeführt oder ob per net start gestartet (fals man das muß)

Aber wird doch sicher ne elegantere lösung geben?

Captnemo 19. Mai 2003 10:10

Hi Chewie,

Hast du das schon mal gemacht?

Meiner Meinung nach basiert eine Anwendung ja auf TApplication und ein Service auf TService. Ist das den in einem Programm vereinbar?

Obwohl wenn man beide Klassen implementiert? Hm, ich werde das mal ausprobieren, mal sehen obs klappt.

Wenn du dazu ein Beispielcode hast, dann poste ihn doch mal.

magicshadow 19. Mai 2003 11:14

Also services sind ganz normale Programme, mit einer kleinen besonderheit. Sie haben bestimmte prozeduren. Diese prozediren werden vom Service manager angesprochen, solten diese nicht vorhanden sien gibt der service manager fehler beim starten/beenden oder anderen aktionen aus. Einziges problem, wenn man eine Service-Anwendung erstellt beendet sich diese nach einem normalen ausführen selbstständig wieder. Die stelle an der sich die Anwendung beendet sollte aber auffindbar sein ;)

Ach, was noch funktioniert:
global:
var exec:boolean;
im onStart und onStop des Services einfach
exec:=false;
im oncreate einfach
exec:=true;
und im onClose
while exec do application.processmessages; //es muß die Unit Forms als letzte eingetragen werden!

Dann beendet sich das programm bei einem normalen starten nicht mehr! (funst bei mir recht gut, es belegt jedoch alle freie CPU auslastung.)

Captnemo 19. Mai 2003 11:25

Zitat:

Zitat von magicshadow
(funst bei mir recht gut, es belegt jedoch alle freie CPU auslastung.)

Das wäre aber nicht unbedingt schön. Macht bei den Benutzer dann ein unprofessionellen Eindruck.

Aber es muß doch auch ohne volle CPU-Auslastung gehen, geht bei Apache ja auch :mrgreen:

magicshadow 19. Mai 2003 11:32

geht, verlangsamt aber das programm ein wenig!
und im onClose
while exec do begin
application.processmessages;
sleep(1);
end;

na ja, ich guck heute abend mal wo dieses blödsinnige beenden, fals es normal gestartet wurde steht :)

s14 19. Mai 2003 11:33

Ich weis ja nicht ob's noch interessiert, aber mit dem Tool "Srvany.exe" aus dem Resource Kit von Microsoft kann eine normale Applikation auch als Dienst gestartet werden.

Gruß
s14

Chewie 19. Mai 2003 11:35

Zitat:

Zitat von Captnemo
Hi Chewie,

Hast du das schon mal gemacht?

Meiner Meinung nach basiert eine Anwendung ja auf TApplication und ein Service auf TService. Ist das den in einem Programm vereinbar?

Obwohl wenn man beide Klassen implementiert? Hm, ich werde das mal ausprobieren, mal sehen obs klappt.

Wenn du dazu ein Beispielcode hast, dann poste ihn doch mal.

Ich kann dir da leider wenig weiterhelfen, ich hab bisher noch nie einen Service geschrieben. Aber ich schätz mal, es wird schwierig, eine Anwendung als "normale" Anwendung laufen zu lassen und nur bei Bedarrf als Service zu installieren und zu starten, wenn man ein Service von Delphi (über Datei->Neu->Service) erstellen lässt. Aber wie gesagt, ich weiß es nicht. Mögllich ist es auf jeden Fall, die Frage ist eben nur, wie.

Captnemo 19. Mai 2003 11:35

War bekannt (zumindest mir :mrgreen: ).

Geht auch, ist aber nicht dasselbe. Eleganter wäre es wenn Dienst und Anwendung in einem Prog wäre.

magicshadow 21. Mai 2003 14:47

und wie immer ist es so simpel :)

Im nachvolgenden code wird nach dem startparameter "/n" gesucht, sollte dieser vorhanden sein (beim start mit angegeben) soll als normale exe gestartet werden, wenn nicht soll als service gestartet werden.
Code:
program exeservice;

uses
  SvcMgr, forms, sysutils,
  Unit1 in 'Unit1.pas' {Service1: TService};

{$R *.RES}

begin
  SvcMgr.Application.Initialize;
  SvcMgr.Application.CreateForm(TService1, Service1);
  if FindCmdLineSwitch('n', ['-', '/'], True) then
      forms.Application.Run;
  else
      SvcMgr.Application.Run;
end.
Es sollte nun ein kinderspiel sein am angang zu überprüfen, ob die exe selbst als dienst instaliert ist, wenn ja dann soll auch als solcher gestartet werden, wenn nicht startet die exe als Anwendung. :)

Noch fragen?

FriFra 21. Jul 2003 10:00

Re: Applikation als NT Service (System Dienst) unter XP star
 
Also ich habe das Problem anders gelöst. Mein Problem war, das ich mehrere Programme zum Service machen wollte, allerdings ist das bei ferigen Programmen nicht sooo trivial wie es auf den ersten Blick erscheinen mag. Deshalb habe ich mir einen "ServiceWrapper" geschrieben, welcher beliebige exe's auf dem Systemkonto laufen lässt.
Es werden auch mehrere exe's auf einmal unterstützt. Wenn das letzte dieser Programme nicht mehr läuft, dann beendet sich der Service selbsständig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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