Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateMutex und seine Grenzen (https://www.delphipraxis.net/171987-createmutex-und-seine-grenzen.html)

Patrick 5. Dez 2012 17:17

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!

Klaus01 5. Dez 2012 17:37

AW: CreateMutex und seine Grenzen
 
Hallo,

hat das unterschiedliche setzen von
Zitat:

bInitialOwner [in]

If this value is TRUE and the caller created the mutex, the calling thread obtains initial ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section.
Quelle:
Auswirkungen auf das von Dir beschriebene Verhalten?

Grüße
Klaus

Zacherl 6. Dez 2012 08:13

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

Patrick 6. Dez 2012 09:11

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

MeierZwoo 6. Dez 2012 13:03

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 10:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz