![]() |
CreateMutex und seine Grenzen
Hallo,
Ich überprüfe ob meine Anwendung schon läuft mit Hilfe des Mutex-Handles. Das funktioniert auch solange ich das mit dem selben Benutzer mache. Wenn ich allerdings den Benutzer wechsle kann ich meine Anwendung ein zweites mal starten. Das Handle ist sogar das gleiche!? Ist das Handle auf Benutzer beschränkt? Wie kann ich meine Anwendung systemweit auf eine Instanz beschränken? Danke für euer Hilfe! |
AW: CreateMutex und seine Grenzen
Hallo,
hat das unterschiedliche setzen von Zitat:
![]() Auswirkungen auf das von Dir beschriebene Verhalten? Grüße Klaus |
AW: CreateMutex und seine Grenzen
Über Benutzergrenzen hinaus (dazu zählen auch Services und elevated Prozesse) geht es nur, wenn du die lpMutexAttributes initialisierst.
Delphi-Quellcode:
Wie es beim Mutex mit dem Namen aussieht, weiß ich grade nicht sicher. Bei Events muss der Name zusätzlich ein "Global\" Prefix beinhalten. Steht aber sicher was im MSDN.
var
FSA: SECURITY_ATTRIBUTES; FSD: SECURITY_DESCRIPTOR; begin InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@FSD, true, nil, false); FSA.lpSecurityDescriptor := @FSD; FSA.nLength := sizeof(SECURITY_ATTRIBUTES); FSA.bInheritHandle := true; |
AW: CreateMutex und seine Grenzen
Jep, so funktioniert es! Danke.
Delphi-Quellcode:
var
wndMain : HWND; FSA: SECURITY_ATTRIBUTES; FSD: SECURITY_DESCRIPTOR; begin InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@FSD, true, nil, false); FSA.lpSecurityDescriptor := @FSD; FSA.nLength := sizeof(SECURITY_ATTRIBUTES); FSA.bInheritHandle := true; mHandle := CreateMutex(@FSA, True, PWideChar('Global\' + Ident)); if (GetLastError = ERROR_ALREADY_EXISTS) then |
AW: CreateMutex und seine Grenzen
Evtl. OT:
Mutex funktioniert ja auch nur auf derselben Station. Bei nicht netzwerkfähigen Programmen/Daten kann es interessant sein, einen Mehrfachaufruf auch durch andere Station im LAN zu unterbinden, wenn diese auf gemeinsame Verzeichnisse zugreifen (Um sich nicht gegenseitig die Daten zu zerschießen). Da mir noch nichts besseres eingefallen ist, behelfe ich mich mit einem (exclusiven) Dateizugriff auf eine (evtl. auch Dummy-)Datei im gemeinsamen Verzeichnis und fange das IO-Result ab - wenn IOResult<>0, dann Programmende mit Meldung "Mehrfachaufruf ..." :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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