![]() |
Createmutex / Windows 7 / 64bit Problem
Hallo Zusammen...
Ich habe einen Servicedienst mit Adminrechten geladen... Dieser Dienst holt sich ein Mutex mit:
Delphi-Quellcode:
Ein anderes Programm soll abfragen ob der Service geladen ist mit:
ServiceGeladen := CreateEvent(nil,true,true,ServiceDa);
SetEvent(ServiceGeladen);
Delphi-Quellcode:
Bisher (unter Vista 32Bit) funktionierte das prima so...
Geladen := CreateMutex(nil, true,ServiceDa);
if Geladen = 0 then begin Hat jemand ne Idee woran es liegt, dass es jetzt nicht mehr läuft? - 64 Bit? - Windows 7 - sonstiges... Grüsse Mavarik :coder: PS.: Lasterror = 0 Gelanden = 256 |
Re: Createmutex / Windows 7 / 64bit Problem
Das Erste ist ein eigentlich ein Event, d.h. das sind zwei völlig verschiedene Objekte.
Also, du kannst Events verwenden, statt Mutexes, musst aber dieselbe Funktion (CreateMutex <-> CreateEvent) nutzen. Schau dir die Doku in der MSDN dazu genau an. |
Re: Createmutex / Windows 7 / 64bit Problem
Oh Cool ist mir nicht aufgefallen...
Komisch, dass es unter Vista so funktioniert.. Aber auch wenn ich bei beiden den CreateEvent verwende erhalte ich nicht das gewünschte Ergebiss Sollte nicht GetLastError = ERROR_ALREADY_EXISTS sein? Grüsse :dp: |
Re: Createmutex / Windows 7 / 64bit Problem
Muss da vielleicht auch das berühmte "GLOBAL\" vor?
|
Re: Createmutex / Windows 7 / 64bit Problem
Zitat:
Warum zeigt sich erst unter Windows 7 das Problem oder liegt es an 64 Bit...? Wie gesagt unter Vista 32 läuft es... Mavarik |
Re: Createmutex / Windows 7 / 64bit Problem
War mehr ins blaue geraden :) .. Naja der Mutex bekommt ja einen Namen, und der Name sollte dann nicht "asdf" sein, sondern "GLOBAL\asdf". Kannst ja mal versuchen, keine Ahnung ob es hilft.
|
Re: Createmutex / Windows 7 / 64bit Problem
Zitat:
Aber auch alle anderen Events klappen unter W7_64 nicht mehr... Wo ist der Trick..? Mavarik |
Re: Createmutex / Windows 7 / 64bit Problem
Ich habe folgendes gefunde zu "Global"
![]() Funktioniert aber auch nicht... |
Re: Createmutex / Windows 7 / 64bit Problem
für Global\xxx benötigt man das CreateGlobalPrivilege, was z.B. Admin haben.
|
Re: Createmutex / Windows 7 / 64bit Problem
Zitat:
Ich habe es mit "InitializeSecurityDescriptor" versucht... wollte leider auch nicht... Frank |
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:21 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