Autor |
Beitrag |
moloch
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mi 29.09.04 08:37
Hallo Leute,
kann mir jemand sagen wie ich aus einem Delphi-Projekt einen Dienst machen kann?
mfg
moloch
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 29.09.04 09:15
Ich würde dir gerne ein kleines Projekt zukommen lassen, wo ich das mal gemacht habe. Nach meiner Ansicht einigermaßen anschaulich. Zur Zeit habe ich aber keine Möglichkeit das irgendwo im Internet abzulegen.
Schick mir doch mal eine PM, wo ich dir das hinschicken kann. Sind nur 18K. Eventuell hast du dann eine Möglichkeit das für alle zugänglich zu machen.
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mi 29.09.04 11:06
hey,
ich kann keine anhänge im moment abholen.
gibt es nicht ein paar einfache dinge einzustellen die eine anwendung zum dienst werden lassen?
mfg
moloch
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 29.09.04 11:16
Hier mal ein Teil des Services:
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:
| unit Main;
interface
uses Windows, SysUtils, Controls, SvcMgr, ExtCtrls, Classes;
type TEventRecord = Record Anwendung : ANSIString; StartDatum : TDate; StartZeit : TTime; Zeitpunkt : TDateTime; end;
TDatensicherungWitte = class(TService) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure ServiceStart(Sender: TService; var Started: Boolean); private public EventArr : Array of TEventRecord; DatumAnwendungsdatei : TDateTime; function GetServiceController: TServiceController; override; end;
var DatensicherungWitte: TDatensicherungWitte;
implementation
{$R *.DFM} uses Vorgaben;
procedure ServiceController(CtrlCode: DWord); stdcall; begin DatensicherungWitte.Controller(CtrlCode); end;
function TDatensicherungWitte.GetServiceController: TServiceController; begin Result := ServiceController; end;
procedure TDatensicherungWitte.Timer1Timer(Sender: TObject); var cnt : Word; Datei : PChar; f : TextFile; Fehler : Word; FehlerText : String; begin for cnt := 0 to Length(EventArr)-1 do begin if EventArr[cnt].Zeitpunkt < Now then begin AssignFile(F, DienstVerzeichnis + ProtokollDatei); if FileExists(DienstVerzeichnis + ProtokollDatei) then begin Append(F); end else begin Rewrite(F); end; Datei := PChar(EventArr[cnt].Anwendung); Fehler := WinExec(Datei, sw_show); case Fehler of 0 : FehlerText := 'The system is out of memory or resources'; ERROR_BAD_FORMAT : FehlerText := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image)'; ERROR_FILE_NOT_FOUND : FehlerText := 'The specified file was not found'; ERROR_PATH_NOT_FOUND : FehlerText := 'The specified path was not found'; 1,4..10,12..31 : FehlerText := 'unbekannter Fehler'; else FehlerText := 'ohne Fehler gestartet'; end; writeln(F, EventArr[cnt].Anwendung + ': ' + DateTimetoStr(EventArr[cnt].Zeitpunkt) + ' ' + FehlerText); EventArr[cnt].Zeitpunkt := EventArr[cnt].Zeitpunkt + 1; CloseFile(F); end; end; end;
procedure TDatensicherungWitte.ServiceStart(Sender: TService; var Started: Boolean); var f : TextFile; Eintrag : String; begin InitialisiereParameter; try Timer1.Enabled := False; AssignFile(F, DienstVerzeichnis + AuftragsDatei); Reset(F); while not eof(f) do begin Readln(f, Eintrag); Eintrag := Trim(Eintrag); if (Eintrag <> '') and (Copy(Eintrag, 1, 1) <> ';') then begin SetLength(EventArr, Length(EventArr) + 1); EventArr[Length(EventArr)-1].Anwendung := Copy(Eintrag, 1, Pos(';', Eintrag) - 1); Delete(Eintrag, 1, Pos(';', Eintrag)); EventArr[Length(EventArr)-1].StartDatum := StrToDate(Copy(Eintrag, 1, Pos(';', Eintrag) - 1)); if EventArr[Length(EventArr)-1].StartDatum < Date then begin EventArr[Length(EventArr)-1].StartDatum := Date; end; Delete(Eintrag, 1, Pos(';', Eintrag)); EventArr[Length(EventArr)-1].StartZeit := StrToTime(Eintrag); EventArr[Length(EventArr)-1].Zeitpunkt := EventArr[Length(EventArr)-1].StartDatum + EventArr[Length(EventArr)-1].StartZeit; if EventArr[Length(EventArr)-1].Zeitpunkt < Now then begin EventArr[Length(EventArr)-1].Zeitpunkt := EventArr[Length(EventArr)-1].Zeitpunkt + 1; end; end; end; CloseFile(f); Started := True; Timer1.Enabled := True; except Started := False; end; end;
end. |
Ich habe noch einen zweiten Teil, der den Service mit entsprechenden Daten füttert, ihn installiert, beendet, startet und deinstalliert.
Hier die wichtigsten Prozeduren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TfrmMain.btnServiceInstallierenClick(Sender: TObject); begin Winexec(PChar(DienstVerzeichnis + DienstProgramm + ' /INSTALL'), sw_Hide); end;
procedure TfrmMain.btnServiceEntfernenClick(Sender: TObject); begin Winexec(PChar(DienstVerzeichnis + DienstProgramm + ' /UNINSTALL'), sw_Hide); end;
procedure TfrmMain.btnServiceStartenClick(Sender: TObject); begin PerformServiceAction(DienstName,saStart); end;
procedure TfrmMain.btnServiceBeendenClick(Sender: TObject); begin PerformServiceAction(DienstName,saStop); end; |
Falls du nicht klar kommst, melde dich.
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mi 29.09.04 11:46
also das sieht alles schon sehr interessant aus.aber ehrlich gesagt weiss ich jetzt nicht so recht wo ich anfangen soll kann etc.
also ich habe schon eine anwendung die ihren zweck erfüllt.
an welchen stellen muss ich was wie verändern.
kannst du mir das vielleicht irgendwie nahe bringen?
ansonsten erstmal schon mal danke für deine hilfe
mfg
moloch
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 29.09.04 11:54
@Christian: Sorry.
moloch hat folgendes geschrieben: | also das sieht alles schon sehr interessant aus.aber ehrlich gesagt weiss ich jetzt nicht so recht wo ich anfangen soll kann etc.
also ich habe schon eine anwendung die ihren zweck erfüllt.
an welchen stellen muss ich was wie verändern.
kannst du mir das vielleicht irgendwie nahe bringen?
|
Den eigentlichen Service erstellst du mit der Komponente TService. Also, Datei-Neu und dort eine Service-Applikation aufrufen. Damit bekommst du das Grundgerüst. Vergleichst du dann einfach mal mit meinem Source. Das einzige was bei mir dazu gekommen ist, ist die TTimer-Komponente. Eigentlich nicht weiter schwierig.
Dann musst du die Funktionalität deines Programms dort einbauen.
Ich habe mir dann eine zweite Anwendung geschrieben, die die Parameter der Service-Anwendung steuert.
Der Service läuft sehr stabil, seit ca. 2 Jahren, auf einem NT40-Server.
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mi 29.09.04 14:03
ich dank dir erstmal für deine ausführliche hilfe.
mal schaun ob ich das umgebastelt bekomm.
bis dann
moloch
|
|
spitzeu
Hält's aus hier
Beiträge: 2
|
Verfasst: Mo 26.01.09 15:42
Hallo,
Du hast im Forum ein Beispiel für das Starten/Stoppen eines Dienstes mit "PerformServiceAction" .
Allerdings kennt Delphi5 den Befehl nicht.
Kannst Du mir sagen, wie ich den einbinden kann?
Danke und Gruss aus Hannover
Uwe Spitzenberger
uwe@clearwater-systems.de
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 16:47
Dies ist ja auch kein Standardbefehl. Hast du denn mal nach DIENST STARTEN UND SO gesucht? In der Library hier liegt nämlich ein entsprechender FAQ-Eintrag:
www.delphi-library.de/viewtopic.php?p=187
Und inkl.Statusabfrage gibts hier etwas:
www.delphipraxis.net/topic105934.html
|
|
spitzeu
Hält's aus hier
Beiträge: 2
|
Verfasst: Mo 26.01.09 22:52
Hallo,
das habe ich auch kurz nach meiner Frage gemerkt und mittlerweile bereits implementiert.
Vielen Dank trotzdem.
|
|