Autor Beitrag
Zablus
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 29.06.11 02:51 
Hallo zusammen,

ich verwende in einer Anwendung seit einiger Zeit eine Methode um Services zu beenden.
Die Implementierung dieser Methode wird im Internet häufig angeboten:

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:
function ServiceStop(sService : string; sMachine : string = '') : boolean;
var
  schm, schs   : SC_Handle;
  ss     : TServiceStatus;
  dwChkP : DWord;
begin
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_STOP or SERVICE_QUERY_STATUS);
    if(schs > 0)then
    begin
      if(ControlService(schs, SERVICE_CONTROL_STOP, ss)) then
      begin
        if(QueryServiceStatus(schs, ss))then
        begin
          while(SERVICE_STOPPED<>ss.dwCurrentState)do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs, ss))then
            begin
              break;
            end;
            if(ss.dwCheckPoint < dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_STOPPED=ss.dwCurrentState;
end;


Leider habe ich unter Windows 7 (64 Bit) immer wieder das Problem, dass die Funktion den gewünschten Dienst nicht beendet und trotzdem TRUE zurückliefert. Unter Windows XP habe ich dieses Problem noch nicht feststellen können.
Weiß jemand, was ich falsch mache? Gibt es bessere Implementierungen dieser Funktion für Windows7?

EDIT: Problem gelöst. Es lag an der Uhrzeit. Ich war zu müde um eine andere Schwachstelle im Code zu bemerken. Die Funktion ServiceStop ist so OK wie sie da steht. Sorry.