AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CreateMutex() verhält sich komisch

Ein Thema von Shark99 · begonnen am 23. Apr 2020 · letzter Beitrag vom 23. Apr 2020
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

CreateMutex() verhält sich komisch

  Alt 23. Apr 2020, 15:18
Ich muss einen Bug in einer 10 Jahre alten App fixen, die seit Windows update v1909 nicht mehr korrekt funktioniert.

Man soll nur eine Instanz der Exeutable starten können.

Der alte Code der nicht mehr funktioniert schaut so aus:
Code:
  MutexHandle := CreateMutex(nil, True, 'NameOfTheApp');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
   log('errorcode is ERROR_ALREADY_EXISTS, bring app to front');
   ...
  end else
  begin
   log('errorcode is *NOT* ERROR_ALREADY_EXISTS, app darf weiter laufen');
   ...
  end;
10 Jahre lang, wenn man die Executable zum zweiten mal startete war das MutexHandle das gleiche wie bei der ersten Instanz, und GetLastError war ERROR_ALREADY_EXISTS. Nun ist der Handle des Mutex bei jedem Start der Exe ein neuer Handle und damit kommt ERROR_ALREADY_EXISTS nie zu stande, d.h. eine zweite Instanz der Exe wird gestartet.

Weiß jemand vielleicht wieso dieses Verhalten plötzlich da ist, und was man als Alternative zum CreateMutex nehmen könnte? FindWindow kommt nicht in Frage, weil die App nicht immer mit einem Fenster startet.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#2

AW: CreateMutex() verhält sich komisch

  Alt 23. Apr 2020, 15:44
Versuch mal ein 'Global\' + vor den Namen des Mutex zu setzen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: CreateMutex() verhält sich komisch

  Alt 23. Apr 2020, 15:59
Du musst dir erstmal das Handle anschauen und wenn es Null ist, dann GetLastError() prüfen.

PS: Nur weil das zurückgegebene Handle in einem 2. Prozess ein anderes ist heißt das nicht dass das darunterliegende Mutex ein anderes ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#4

AW: CreateMutex() verhält sich komisch

  Alt 23. Apr 2020, 16:10
jo, wollt ich auch grad sagen.

Delphi-Quellcode:
MutexHandle := CreateMutex(nil, True, 'Global\NameOfTheApp');
if MutexHandle <> 0 then
  if GetLastError = ERROR_ALREADY_EXISTS then
    ExistierteShon_BringToFrontAndExit
  else
    ExistierteNochNicht
else
  RaiseLastOSError;
Siehe die Dokumentation: MSDN-Library durchsuchenCreateMutex
"Return value" und die "Remarks" können auch nie schaden.

Es kann sein, dass das Verhalten bei "ohne Global/Local" geändert wurde, oder was mit Benutzerrechten oder das was dort vonwegen "guidelines outlined for Terminal Services" gesagt wurde oder ...






Bei den meisten APIs ist es so, dass man GetLastError auch nur dann auswerten darf, wenn das Result "Fehler" sagt, also z.B. bei sowas wie 0 oder -1,
aber gut, hier gibt es noch den Senderfall, dass Result<>0 und GetLastError=ERROR_ALREADY_EXISTS ist.

Denn wenn es keine Fehler gab, dann muß LastError nicht auf 0 (ERROR_SUCCESS) gesetzt werden. In diesem Fall ist das der Fehler "irgendeiner" WinAPI, die vorher aufgerufen wurde.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Apr 2020 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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