![]() |
Re: Createmutex / Windows 7 / 64bit Problem
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:
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.
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; |
Re: Createmutex / Windows 7 / 64bit Problem
Zitat:
Leider verschieb das "nur" das Problem, weil unter Win7 das gleiche Problem mit den Events habe... Auch die Events haben unter Vista mit eingeschalteter UAC ohne den globalen Namespace funktioniert... Mavarik :coder: |
Re: Createmutex / Windows 7 / 64bit Problem
Naja, man wartet ja eigentlich nicht auf den Dienst selbst, sondern auf irgendein Feature, welches er bereitstellt, z.B. Pipe.
|
Re: Createmutex / Windows 7 / 64bit Problem
Zitat:
Das ganze mit verschiedenen Threads die alle über Events-Handels synconisiert werden... Aber das funktioniert nicht mehr und Win 7... Wenn ich die gleichen Exe unter Vista laufen lassen - alles einwandfrei... Habe mir auch gerade die Updates der API usw. geladen... Gleiches Problem... Mavarik :gruebel: |
Re: Createmutex / Windows 7 / 64bit Problem
Hallo Christian!
Hast Du mal ein Stück source für "CreateGlobalPrivilege"... Leider kann ich dazu nix finden.. Grüsse :gruebel: |
Re: Createmutex / Windows 7 / 64bit Problem
OK So funktioniert es...
Delphi-Quellcode:
Ich gehe davon aus, dass ich alle Mutex und Events mit dem Parameter aufrufen muss...
var
SecurityDesc: TSecurityDescriptor; SecurityAttr: TSecurityAttributes; begin InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.lpSecurityDescriptor := @SecurityDesc; SecurityAttr.bInheritHandle := False; Geladen := CreateMutex(@SecurityAttr, false,pchar('Global\'+ServiceDa)); error := GetLastError; if error = ERROR_ALREADY_EXISTS Werde ich mal testen... Grüsse Mavarik :coder: |
Re: Createmutex / Windows 7 / 64bit Problem
Das Privileg heißt SE_CREATE_GLOBAL_NAME und wird mit AdjustTokenPrivilege oder JwEnablePrivilege von JWSCL aktiviert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz