Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Aus Delphi-Projekt einen Dienst machen
moloch - Mi 29.09.04 08:37
Titel: Aus Delphi-Projekt einen Dienst machen
Hallo Leute,
kann mir jemand sagen wie ich aus einem Delphi-Projekt einen Dienst machen kann?
mfg
moloch
jasocul - 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 - 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 - Mi 29.09.04 11:16
Hier mal ein Teil des Services:
Delphi-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:
| 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 - 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 - 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 - 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 - 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
spitzeu - Mo 26.01.09 22:52
Hallo,
das habe ich auch kurz nach meiner Frage gemerkt und mittlerweile bereits implementiert.
Vielen Dank trotzdem.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!