Autor Beitrag
moloch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 29.09.04 11:16 
Hier mal ein Teil des Services:
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    EventArr : Array of TEventRecord;
    DatumAnwendungsdatei : TDateTime;
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  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 {11} : FehlerText := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image)';
        ERROR_FILE_NOT_FOUND {2} : FehlerText := 'The specified file was not found';
        ERROR_PATH_NOT_FOUND {3} : 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, 11) <> ';'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:
ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 16:47 
Dies ist ja auch kein Standardbefehl. Hast du denn mal nach Suche bei Google 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



BeitragVerfasst: Mo 26.01.09 22:52 
Hallo,
das habe ich auch kurz nach meiner Frage gemerkt und mittlerweile bereits implementiert.

Vielen Dank trotzdem.