Dienste mit Delphi beenden

Karl Förster

Erfahrenes Mitglied
Hallo Leute,

ich schreibe gerade an einem kleinen Tool, womit ich Dienste (genauer Apache und MySQL) vom Tray aus steuern kann. Diverse andere Tools möchte ich nicht verwenden weil ich spezielle Funktionen benötige. Das ist ja auch nicht das Problem an dieser Stelle. Alles funktioniert soweit sehr gut. Ich kann die Dienste starten und teilweise auch beenden. Ich poste dazu mal die Funktion zum beenden eines Dienstes:
Code:
function ServiceStop(
  sMachine,
  sService : string ) : boolean;
var
  schm, schs   : SC_Handle;
  ss     : TServiceStatus;
  dwChkP : DWord;
begin
  // connect to the service
  // control manager
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);

  // if successful...
  if(schm > 0)then
  begin
    // open a handle to
    // the specified service
    schs := OpenService(
      schm,
      PChar(sService),
      SERVICE_STOP or SERVICE_QUERY_STATUS);

    // if successful...
    if(schs > 0)then
    begin
      if(ControlService(
           schs,
           SERVICE_CONTROL_STOP,
           ss))then
      begin
        // check status
        if(QueryServiceStatus(
             schs,
             ss))then
        begin

          while(SERVICE_STOPPED
            <> ss.dwCurrentState)do
          begin

            //
            // dwCheckPoint contains a
            // value that the service
            // increments periodically
            // to report its progress
            // during a lengthy
            // operation.
            //
            // save current value
            //

            dwChkP := ss.dwCheckPoint;

            //
            // wait a bit before
            // checking status again
            //
            // dwWaitHint is the
            // estimated amount of time
            // the calling program
            // should wait before calling
            // QueryServiceStatus() again
            //
            // idle events should be
            // handled here...
            //

            Sleep(ss.dwWaitHint);

            if(not QueryServiceStatus(
                 schs,
                 ss))then
            begin

              // couldn't check status
              // break from the loop

              break;
            end;

            if(ss.dwCheckPoint <
              dwChkP)then
            begin

              // QueryServiceStatus
              // didn't increment
              // dwCheckPoint as it
              // should have.
              // avoid an infinite
              // loop by breaking

              break;
            end;

          end;
          
        end;
      end;

      // close service handle
      CloseServiceHandle(schs);
    end;

    // close service control
    // manager handle
    CloseServiceHandle(schm);
  end;

  // return TRUE if
  // the service status is stopped
  Result :=
    SERVICE_STOPPED =
      ss.dwCurrentState;
end;

Die Funktion wird also aufgerufen und der Name des Computers und des Dienstes übergeben. Das erste Parameter bleibt leer damit es der lokale Rechner ist.
Mein genaues Problem besteht nun darin:
Wenn ich das ganze für den Apache aufrufe, also der Dienstname ist "Apache", dann funktioniert alles super, wenn ich aber "MySql" angebe bleibt das Proggi in der Schleife stecken wo er den Status abfragt und erzeugt eine Endlosschleife. Der Dienstname "MySql" ist aber richtig, da ich ihn ja über diesen Namen auch starten kann.

Ich vermute fast, dass MySql beim beenden nicht die richtigen Statusmeldungen zurückgibt, wodurch mein Proggi damit nicht anfangen kann. Hat jemand noch eine andere Lösung um den Dienst zu beenden oder zufällig das gleiche Problem?

Wäre für Tipps schonmal sehr dankbar.

gruß
worka
 

Neue Beiträge