Ich arbeite an einer Anwendung, von der immer nur eine Instanz existieren muss. Dafür gibt es mehrere Möglichkeiten:
Die Mutex-Option scheint mir die zuverlässigste und eleganteste zu sein.
Bevor jedoch meine zweite Instanz beendet wird, möchte ich eine Nachricht an die bereits laufende Instanz senden. Dazu benötige ich einen Handle für den Thread (oder den Prozess), der den Mutex besitzt.
Es scheint jedoch keine API-Funktion zu geben, um den Ersteller / Eigentümer eines bestimmten Mutex zu erhalten. Überspringe ich es gerade? Gibt es eine andere Möglichkeit, zu diesem Thread / Prozess zu gelangen? Gibt es einen anderen Weg, dies zu tun?
Update : Dieser Typ sendet einfach eine Nachricht an all laufende Prozesse. Ich denke, das ist möglich, aber ich mag es nicht wirklich ...
Ich glaube nicht, dass es eine triviale Möglichkeit gibt, den tatsächlichen Eigentümer eines Mutex zu lösen, aber der Prozess, dem er gehört, kann andere sekundäre Elemente erstellen, deren Lebenszeiten damit verbunden sind. Es gibt viele Mechanismen, die geeignet sind, um ohne einen Hauptbildschirm zurückzugreifen.
Hier sind Referenzlinks für die ersten beiden Optionen.
Damit sollten Sie mit der ursprünglichen Anfrage beginnen, um einen Prozess zu erhalten, der einen Mutex besitzt.
Es ist in C #, aber die Win32-Aufrufe sind gleich.
%Vor%Ich habe nie verstanden, warum es sinnvoll ist, einen Mutex zu verwenden, der keine Signalfunktion besitzt. Ich würde stattdessen ein Ereignis (mit CreateEvent) erstellen, das die gleichen Eigenschaften wie das Erstellen eines Mutex hat (dh mit einem Namen, dass das Objekt bereits existiert), aber Sie können das Ereignisflag im neuen Prozess so lange wie das Original setzen Prozess wartet auf das Event-Flag, es kann benachrichtigt werden, wenn es sich selbst aufwecken muss.
Erstellen Sie einen gemeinsamen Speicherbereich mit dem festen Namen:
Dann können Sie jede gewünschte Struktur einfügen, einschließlich Prozess-ID, HWND usw.
Es gibt eine portable Option : Erstellen Sie einen Socket an einem Port (mit einer festen Nummer) und warten Sie (accept) darauf. Die zweite Instanz der App wird fehlschlagen, da der Port bereits vergeben ist. Dann kann sich die zweite Instanz mit dem Socket der primären Instanz verbinden und alle gewünschten Informationen senden.
Ich hoffe, das hilft ...
Sie können es immer auf UNIX-Art machen und eine "pid" -Datei erstellen, indem Sie die Prozess-ID der aktuell laufenden Instanz in diese Datei einfügen. Lassen Sie dann die App die Datei beim Beenden löschen.
Beim Start einer neuen Instanz sollte überprüft werden, ob der Prozess in der PID-Datei auch tatsächlich aktiv ist (falls die Anwendung abnormal beendet wird und die Datei nicht gelöscht wird)
Tags und Links multithreading process winapi mutex singleinstance