Ich frage mich ein wenig, wozu man da ein
Mutex bemüht. Viel sauberer wäre es
imho den Service Manager einfach zu fragen ob der Service läuft. Das ist nicht nur einfacher, sondern auch sicherer (es gibt nämlich einen Zeitraum in der der
Mutex noch nicht existiert, Dein Service aber im Begriff ist zu starten):
Delphi-Quellcode:
uses winsvc;
function IsServiceRunning(serviceName : string) : Boolean;
var
scmHandle : THandle;
serviceHandle : THandle;
serviceStatus : TServiceStatus;
begin
Result := FALSE;
scmHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, GENERIC_READ);
if scmHandle <> 0 then
begin
serviceHandle := OpenService(scmHandle, PChar(serviceName), SERVICE_QUERY_STATUS);
if serviceHandle <> 0 then
begin
if QueryServiceStatus(serviceHandle, serviceStatus) then
result := serviceStatus.dwCurrentState <> SERVICE_STOPPED;
CloseServiceHandle(serviceHandle);
end;
CloseServiceHandle(scmHandle);
end;
end;
Wenn Du wirklich ein
Mutex nutzen magst, dann sollte es meiner Ansicht nach notwendig sein, den
Mutex im globalen Namespace zu erstellen. Dazu musst Du Dir dann vorher entsprechende Rechte besorgen.