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:
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.