Win32: Wie man den Prozess/thread, der Besitzer eines mutex?
Arbeite ich eine Anwendung nur eine Instanz existieren muss, zu einem bestimmten Zeitpunkt. Es gibt mehrere Möglichkeiten, dies zu erreichen:
- Überprüfen Sie die Laufenden Prozesse für Sie eine passende unserer EXE-name (unzuverlässig)
- Finden Sie die wichtigsten Fenster (unzuverlässig, und ich nicht immer ein Hauptfenster)
- Erstellen Sie einen mutex mit einem eindeutigen Namen (GUID)
Den mutex option scheint mir die zuverlässigsten und elegant.
Jedoch, vor meinem zweiten Instanz beendet wird, möchte ich um eine Nachricht an die bereits laufende Instanz. Für diese, ich brauche einen handle für den thread (oder Prozess), die Eigentümer des mutex.
Jedoch, scheint es keine API-Funktion, um die Ersteller/Besitzer einer bestimmten mutex. Ich bin einfach auf ihn blicken? Gibt es einen anderen Weg, um zu diesem thread/Prozess? Gibt es einen anderen Weg zu gehen über diese?
Update: Dieser Kerl einfach eine broadcast-Nachricht an alle Laufenden Prozesse. Ich denke, das ist möglich, aber ich weiß nicht wirklich, wie es...
- Doppelte? stackoverflow.com/questions/19147/...
- Nicht wirklich. Keine der Antworten sagt mir, wie man den Prozess zu behandeln.
- Hier ist eine doppelte, obwohl es wurde nie beantwortet: stackoverflow.com/questions/541477/...
- Gut, es beantwortet wurde, aber wahrscheinlich nicht in der Art und Weise der Fragesteller gehofft, es würde sein 🙂
- Ich würde nicht sagen, dass ein exaktes Duplikat entweder, obwohl Sie die Antwort auf meine primäre Frage, ist es nicht bieten eine alternative Lösung-etwas, das ich explizit danach gefragt.
- Nicht setzen das als Antwort (da keine Antwort), aber es kann von Interesse sein: msdn.microsoft.com/en-us/library/aa446629%28VS.85%29.aspx zeigt, wie der Eigentümer (im Sinne der user) eine Datei sperren, und konnte Sie dieselbe zu einem mutex. Noch nicht geben Sie eine PID, obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass es eine triviale Weise zu lösen, die eigentlichen Besitzer des Mutex, aber der Prozess, der Besitzer kann es schaffen, andere sekundäre Elemente, deren Laufzeiten sind an Sie gebunden. Es gibt viele Mechanismen, die geeignet sind für einen Rückruf, in-Prozess, ohne ein Hauptfenster.
Hier sind Referenz-links für die ersten beiden Optionen.
Datei-Moniker @ MSDN
Dieser sollte Ihnen den Einstieg auf die ursprüngliche Anfrage um einen Prozess, der Besitzer eines mutex.
Es ist in C#, aber die Win32-Aufrufe sind die gleichen.
NtQueryMutant
um den owner-status und die PID/ThreadID des Eigentümers.Ich habe nie wirklich verstanden, das rational hinter der Verwendung eines Mutex, die keine Signalisierung Fähigkeit. Ich würde stattdessen ein Ereignis erstellen (mit CreateEvent), welches die gleichen Eigenschaften wie die Erstellung eines mutex (d.h. mit einem Namen, den es zurückkehren kann, dass das Objekt bereits existiert), aber Sie können die event-flag in den neuen Prozess, so lange wie der ursprüngliche Prozess wartet auf das Ereignis zu Kennzeichnen, können benachrichtigt werden, wenn es Bedürfnisse zu wecken, sich.
Erstellen Sie eine shared-memory-Bereich mit dem festen Namen:
http://msdn.microsoft.com/en-us/library/aa366551%28VS.85%29.aspx
Dann Sie können jede Art von Struktur, die Sie wie im inneren, einschließlich Prozess-id, HWND usw.
Es gibt eine portable-option: erstellt einen socket an einem port (mit einer festen Zahl) und warten Sie (nehmen Sie) auf. Die zweite Instanz der app schlägt fehl, da der port schon vergeben ist. Dann die zweite Instanz kann eine Verbindung zu der Buchse der primären Instanz und senden Sie alle Informationen gewünscht.
Ich hoffe das hilft...
Konnte man immer tun es die UNIX Art und Weise und erstellen Sie einen "pid" - Datei, setzen Sie die Prozess-id der aktuell ausgeführten Instanz in die Datei. Dann die app löschen Sie die Datei, wenn er sich beendet.
Wenn eine neue Instanz startet es sollte stellen Sie sicher, dass der Prozess in der PID-Datei ist tatsächlich lebt, als auch (im Falle, dass die app unerwartet beendet wird und die Datei nicht gelöscht)
CreateFileMapping
) gerade richtig. Danke, dass du mich auf diese Spur. Ich werde dies akzeptieren, es sei denn, jemand kommt mit einer besseren Lösung.