AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Warum lässt sich der Dienst nicht beenden?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum lässt sich der Dienst nicht beenden?

Ein Thema von Chewie · begonnen am 28. Jul 2004 · letzter Beitrag vom 28. Jul 2004
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:13
Ich habe einen Dienst gebastelt, der ohne die TService-Klasse von Delphi auskommt. Er lässt sich auch wunderbar starten, nur mit dem Beenden gibts Probleme. Wenn ich das ganze mit Delphi kompiliere, passiert beim Stoppen eine Zeit lang gar nichts, mit FreePascal kommt nach ein paar Sekunden eine Fehlermeldung, der Dienst wird beendet, die Prozedur OnStart (siehe Quellcode) wird aber nicht mehr ausgeführt.

Hier mal die relevanten Codefragmente:

Delphi-Quellcode:
procedure ServiceMain(dwArgc: DWord; var lpszArgv: PChar);
begin
  //Service-Handler registrieren
  Service.FhStatus := RegisterServiceCtrlHandler(SCServiceName, @ServiceHandler);
  if Service.FhStatus <> 0 then
  begin
    //Service initialisieren
    ZeroMemory(@Service.Fss, Sizeof(Service.Fss));
    Service.Fss.dwServiceType := SERVICE_WIN32_OWN_PROCESS;
    Service.Fss.dwCurrentState := SERVICE_START_PENDING;
    Service.Fss.dwControlsAccepted := SERVICE_ACCEPT_STOP;
    Service.Fss.dwWin32ExitCode := NO_ERROR;
    Service.Fss.dwWaitHint := 1000;
    SetServiceStatus(Service.FhStatus, Service.Fss);

    //Event OnStart
    if Assigned(Service.OnStart) then
      Service.OnStart;

    //Service läuft
    Service.FStopped := False;
    Service.Fss.dwCurrentState := SERVICE_RUNNING;
    SetServiceStatus(Service.FhStatus, Service.Fss);

    //Event OnExecute
    if Assigned(Service.OnExecute) then
      Service.OnExecute;

    //Event OnStop
    if Assigned(Service.OnStop) then
      Service.OnStop;

    //Service wurde beendet
    Service.Fss.dwCurrentState := SERVICE_STOPPED;
    SetServiceStatus(Service.FhStatus, Service.Fss);
  end;
end;

procedure ServiceHandler(fdwControl: DWord);
begin
  case fdwcontrol of
    SERVICE_CONTROL_STOP:
      begin
        Service.Stopped := True;
        Service.Fss.dwCurrentState := SERVICE_STOP_PENDING;
        SetServiceStatus(Service.FhStatus, Service.Fss);
      end;
    SERVICE_CONTROL_SHUTDOWN:
      Service.Stopped := true;
  end;
end;

procedure TService.Start;
var
  dpTable: Array[0..0] of TServiceTableEntry;
begin
  dpTable[0].lpServiceName := 'Doesnt matter';
  dpTable[0].lpServiceProc := @ServiceMain;
  StartServiceCtrlDispatcher(dpTable[0]);
end;
Die Methode Start von TService wird dabei als Programmeinstiegspunkt aufgerufen. Service ist eine globale Instanz von TService.

Die Methode in OnExecute sieht so aus:

Delphi-Quellcode:
procedure TUCClass.MyExecuteMethod;
begin
  while not Stopped do
  begin
    Log(DateTimeToStr(Now) + ': Engine läuft');
    Sleep(5000);
  end;
end;
Hat einer ne Idee, worans liegt?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:30
ich weiss nicht, ob dies alles ist, aber die Signatur müsste so sein:
procedure ServiceMain(dwArgc: DWord; lpszArgv: PChar); stdcall;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:33
Argh, ich habs gefunden: In der OnExecute-Methode greife ich auch das Property Stopped zu. Das ist aber ein anderes Stopped als Service.Stopped.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:35
Zitat von Basilikum:
ich weiss nicht, ob dies alles ist, aber die Signatur müsste so sein:
procedure ServiceMain(dwArgc: DWord; lpszArgv: PChar); stdcall;
Hast recht, daran hatte ich nicht gedacht. Aber da ich bisher sowieso keine Parameter ausgewertet hab, hatte das nichts gemacht.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:40
Na ja, zu früh gefreut, mit Delphi klappt es jetzt, aber wenn ich das ganze mit FreePascal kompilier, kommt immer noch folgende Fehlermeldung:

Code:
---------------------------
Dienste
---------------------------
Der Dienst "UniverseClaim-Engine" auf "Lokaler Computer" konnte nicht beendet werden.



Fehler 1067: Der Prozess wurde unerwartet beendet.


---------------------------
OK  
---------------------------
Na ja, wär schön, wenn das auch mit FPC gehen würde, aber ich kann auch so damit leben.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#6

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:51
ein weiterer Punkt - gemäss Win32-Doc muss der Aufruf so erfolgen:
Delphi-Quellcode:
procedure TService.Start;
var
  dpTable: Array[0..1] of TServiceTableEntry;
begin
  dpTable[0].lpServiceName := 'Doesnt matter';
  dpTable[0].lpServiceProc := @ServiceMain;
  dpTable[1].lpServiceName := nil;
  dpTable[1].lpServiceProc := nil;
  StartServiceCtrlDispatcher(dpTable[0]);
end;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Warum lässt sich der Dienst nicht beenden?

  Alt 28. Jul 2004, 17:56
Danke für den Tip, aber immer noch das gleiche Problem
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz