Entwickler-Ecke
Sonstiges (Delphi) - NT-Service selber programmieren
bis11 - Mi 05.03.03 13:44
Titel: NT-Service selber programmieren
Hallo Leute,
ich habe schon die Tutorials von Delphi-Source.de und Assarbad gelesen und durchgearbeitet. Ich steige da bloß nicht richtig durch. Wie kann ich jetzt mit Delphi einen eigenen NT-Service programmieren. Ich brauche keine Fenster und auch keine Benutzerintervention. Der Service soll mir lediglich beim starten nur etwas überwachen und gegebenenfalls etwas löschen. Wer kann mir weiterhelfen ?
bis11 - Mi 05.03.03 17:52
Hat keiner noch andere Anleitungen, Bücher, Links etc. für mich, wo das drin erklärt wird ?
Klabautermann - Mi 05.03.03 18:00
Hallo,
wenn du eine Professional hast, kannst du mit Datei->Neu->{andere->}Service-Anwendung anfangen.
Weitere Infos gibt es dann in der Online Hilfe.
Gruß
Klabautermann
bis11 - Mi 05.03.03 19:38
Das habe ich ja schon gemacht. Nur ich habe halt nicht so die Ahnung, wie ich anfangen soll und wie nachher der Dienst installiert wird. In der Delphi Hilfe habe ich nichts aussagekräftiges gefunden, oder ich war mal wieder zu blind.
MSCH - Mi 05.03.03 21:06
Titel: HI
Ich poste hier mal ne demo zum Thema Dienste:
Hoffentlich nimmts mir keiner Übel: :wink:
Das einzige was du brauchst ist ein Form: TServiceApplication (Datei-Neu-Service-Application):
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: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| unit main;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,ShellCtrls;
TZVS2VBU = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceShutdown(Sender: TService); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceContinue(Sender: TService; var Continued: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServiceExecute(Sender: TService); private { Private-Deklarationen } inputfolder: String; // Directory originalfiles SCN: TShellChangeNotifier; SCNActive: Boolean; FileList:TStringList; Function FileCopy(Source,dest:String;Moving:Boolean):Boolean; public procedure SCNChange; function GetServiceController: TServiceController; override; end;
var ZVS2VBU: TZVS2VBU;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall; begin ZVS2VBU.Controller(CtrlCode); end;
function TZVS2VBU.GetServiceController: TServiceController; begin Result := ServiceController; end;
// Starten des Dienstes procedure TZVS2VBU.ServiceStart(Sender: TService; var Started: Boolean); begin FileList:= TStringList.Create; SCNActive:= false; SCN:= TShellChangeNotifier.Create(nil); SCNActive:= True; SCN.NotifyFilters:=[nfFileNameChange,nfDirNameChange,nfAttributeChange,nfSizeChange,nfWriteChange,nfSecurityChange]; SCN.Root:= Inputfolder; SCN.WatchSubTree:= False; SCN.OnChange:= SCNChange; started:= true; end;
procedure TZVS2VBU.ServiceShutdown(Sender: TService); begin SCNActive:=False; end;
procedure TZVS2VBU.ServicePause(Sender: TService; var Paused: Boolean); begin SCNActive:= False; Paused:= true; end;
procedure TZVS2VBU.ServiceContinue(Sender: TService; var Continued: Boolean); begin SCNActive:= True; Continued:= True; end;
procedure TZVS2VBU.ServiceStop(Sender: TService; var Stopped: Boolean); begin SCNActive:=False; try SCN.Free; except end; try FileList.Free; except end; stopped:= true; end;
procedure TZVS2VBU.SCNChange; var I:Integer; Path:String; SR: TSearchRec; FoundName:String; P:PChar; begin if SCNActive then begin SCNActive:= False; Path:= IncludeTrailingBackslash(InputFolder); I:= FindFirst(Path+'*.*',faAnyFile and not faDirectory,SR); if I=0 then FoundName:= SR.Name else FoundName:=''; FindClose(SR); if (FoundName<>'')and(FileList.IndexOf(FoundName)<0) then begin begin nu mach ma was end; SCNActive:= True; end; end;
procedure TZVS2VBU.ServiceExecute(Sender: TService); begin while not Terminated do begin ServiceThread.ProcessRequests(true); end; end;
end. |
Ich hab mal die unwichtigen Dinge wie Eventlog rausgeschmissen. Dieser Dienst überwacht ein Verzeichnis (Inputfolder) und führt was aus, wenn sich was Ändert an Dateien. Damit der das nur einmal macht, benutzte ich eine Stringliste in der der bearbeitete Dateiname steht. Kann man natürlich modifizieren. Aber es funktioniert. Ich hab hier nur mal Findfirst genommen keine While-Schleife mit FindFirst/FindNext, weil das Ereignis sowieso für jede Datei aufgerufen wird. Kann man auch modifizerien.
Grüße
MSCH
Motzi - Do 06.03.03 10:23
Ein absolut unverzichtbares Buch wenn du Services schreiben willst ist "Programing Windows Security" von Keith Brown! Dort hast du alle wichtigen Sachen, von Logon-Sessions über Tokens, WindowStations, Desktops bis zu COM-Sicherheit!
bis11 - Do 06.03.03 10:25
Nach dem Buch habe ich auch schon gesucht. Nur ich habe das bei keinem Online-Buchhandel gefunden. Hast Du vielleicht die ISBN-Nummer ?
Klabautermann - Do 06.03.03 10:26
Hallo,
| bis11 hat folgendes geschrieben: |
| Nur ich habe halt nicht so die Ahnung, wie ich anfangen soll und wie nachher der Dienst installiert wird. |
ich habe mal in mein Delphi Handbuch geguckt, und da wird das so beschrieben:
| Delphi 7 Handbuch hat folgendes geschrieben: |
[...]
4. Nachdem Sie die Service-Anwendung erstellt haben, installieren Sie Ihre Services mithilfe des Dienstprotokoll Managers. Andere Anwendungen starten Ihre Services, indem sie Anforderungen an den Dienstprotokoll-Manager senden.
Um die Services Ihrer Anwendung zu Installieren, führen Sie sie unter verwendung der Option /INSTALL aus. [...]
Um die Services zu deinstallieren, führen Sie sie mithilfe der Option /UNINSTALL von der Befehlszeile aus. [...] |
Das Handbüch müstest du als PDF in der Updatasektion von Borland auch runterladen können oder eben in gedrckter Form bei verschieden Händlern die auch Delphi führen erwerben (warscheinlich günstiger als bei Borland selbst). Das Thema Service findest du dann im Kapitel 8.
Gruß
Klabautermann
bis11 - Do 06.03.03 11:59
@Motzi
Hat sich erledigt, habe das Buch gefunden und bestellt.
@Klabautermann
Wo kann ich das bei Borland runterladen ? Ich habe vorhin mal geschaut, aber nichts gefunden. Hast Du vielleicht eine Adresse ?
Klabautermann - Do 06.03.03 12:46
Hallo,
| bis11 hat folgendes geschrieben: |
| Wo kann ich das bei Borland runterladen ? Ich habe vorhin mal geschaut, aber nichts gefunden. Hast Du vielleicht eine Adresse ? |
http://www.borland.com ->downloads->delphi->Updates (Version 7)
Hier musst du dich einloggen (musst also mitglied in der Borland Comunity sein)
dann findest du ziemlich weit unten "Product PDF Documentation".
Gruß
Klabautermann
bis11 - Do 06.03.03 15:41
Ich danke Dir erstmal Klabautermann, könntest Du mir vielleicht sagen, ob ich bei einem Service den genauso behandeln kann mit Haltepunkten wie ein normales Programm ?
Klabautermann - Do 06.03.03 15:53
Hallo,
das kann ich leider nicht. Ich habe zwar mi einem angefangen, das Projekt wurde aber sehr schnell wieder eingefrohren so das ich noch nciht mal zum Debuggen gekommen bin.
Gruß
Klabautermann
bis11 - Fr 07.03.03 16:53
Hi
ich danke erstmal allen beteiligten, habe jetzt meinen ersten Service erfolgreich programmiert. Ich habe nur noch eine kleine Frage, ab welcher Version ist der Schalter /SILENT dabei ? Ich progge aktuell auf Arbeit mit Delphi 4 Prof.
MSCH - Fr 07.03.03 18:41
Titel: Debuggen von Diensten
Kleine Ergänzung,
Debuggen von Diensten geht auch, Dienst starten und Delphi->Prozess verbinden->Service auswählen.
Dann funktionieren auch Breakpoints.
mfg
MSCH
Klabautermann - Fr 07.03.03 18:51
Titel: Re: Debuggen von Diensten
Hallo,
| MSCH hat folgendes geschrieben: |
| Debuggen von Diensten geht auch, Dienst starten und Delphi->Prozess verbinden->Service auswählen. |
wo genau wähle ich das aus?
Neugierig
Klabautermann
MSCH - Fr 07.03.03 18:58
Im Menü wählen:
Start-Mit Prozess verbinden, dann kommt ne Liste in der dein Dienst stehen sollte wenn er läuft, Draufhauen, fertig.
Grüße
MSCH
bis11 - Fr 07.03.03 19:07
Nur noch zum Verständnis, ich compiliere, sage dann Prog.exe /install, starte meinen Dienst und dann gehe ich in Delphi zurück und führe den Menüpunkt Mit Prozess verbinden aus und wählen aus dem Fenster meine Exe aus. Habe ich das ungefähr so richtig wiedergegeben ? :roll:
Ab welcher Delphi-Version gibt es den Schalter /SILENT ?
MSCH - Fr 07.03.03 19:10
Si Senior/Senora.
Einfach ganz einfach.
Den Schalter Silent :roll: keine Ahnung.
MFG
MSCH
bis11 - Fr 07.03.03 19:17
Ich danke MSCH.
@all Jetzt muss ich das nur noch mit dem Schalter \SILENT wissen.
Klabautermann - Fr 07.03.03 21:17
Hallo,
| bis11 hat folgendes geschrieben: |
| @all Jetzt muss ich das nur noch mit dem Schalter \SILENT wissen. |
das weiß ich leider auch nicht.
Gruß
Klabautermann
bis11 - So 23.03.03 13:23
Wie kann ich die Startart festlegen bei einem Service ?
BennyM - Do 11.11.04 15:41
hallo.
ich hab ein kleines problem mit meinem dienst.
jetzt habe ich bei euch gelesen das es die möglichkeit gibt den dienst zu debuggen indem ich sage, mit prozess verbinden. leider funktioniert es bei mir nicht er sagt mir zugriff verweigert.
was mache ich falsch?
ich habe unter start->ausführen gesagt *.exe /install
dann wurde mir der dienst auch in den diensten angezeigt und er ist auch gestartet. aber mit prozess verbinden, kann ich nicht sagen!
kann mir jemand weiterhelfen?
danke
gruß
benny
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!