Entwickler-Ecke
Windows API - Prozess finden + TStringList übertragen
error - Sa 12.04.08 11:46
Titel: Prozess finden + TStringList übertragen
Hallo,
ich würde mein Programm gerne so modifizieren, dass es beim Start guckt, ob schon eine Instanz des Programms läuft und dann gegebenenfalls eine TStringList mit Dateinamen an die erste Instanz übertragt und sich selbst beendet. Ich hab schonmal etwas danach gegoogelt, konnte aber bisher nirgendwo eine Erklärung finden, wie ich das Handle o.ä. der ersten Instanz finde und wie ich dann einen TStringList übertrage.
Hat da jemand von euch eventuell eine genauere Anleitung oder einen Beispielcode, an dem ich mich orientieren könnte?
Danke!
Delete - Sa 12.04.08 12:37
Such mal nach Mutex und WM_COPYDATA.
error - Sa 12.04.08 14:14
Ok, was ich jetzt habe ist folgender Code in der Main-Form:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Mutex := CreateMutex(nil, True, PChar('name')); if (Mutex <> 0) then begin if GetLastError() = ERROR_ALREADY_EXISTS then begin CopyDataStruct.dwData := 0; CopyDataStruct.cbData := 1 + Length(CmdLine); CopyDataStruct.lpData := PChar(CmdLine);
MutexReply := SendMessage(Mutex, WM_COPYDATA, LongInt(Handle), LongInt(@CopyDataStruct)); if MutexReply = 1 then Application.Terminate; end else begin end; end; |
Sehe ich das richtig, dass ich jetzt in dem else-Block einen speziellen Thread starten muss, der mit WaitForSingleObject das Mutex-Handle überwacht?
Delete - Sa 12.04.08 15:55
Wozu willst du denn den Mutex überwachen?
error - Sa 12.04.08 16:18
Um die Daten zu empfangen, die von einer anderen Instanz gesendet werden... oder versteh ich da was falsch?
Delete - Sa 12.04.08 18:57
Du hast die Beiträge nicht richtig gelesen. Der Mutex ist nur dazu da, um zu gucken, ob schon eine Instanz läuft. Die Daten an die schon laufende Instanz sendest du mit WM_COPYDATA an das Fenster der Instanz. Der Mutex spielt hier gar keine Rolle mehr.
error - Sa 12.04.08 19:07
Ah, das erklärt dann auch den Namen. :)
Dann wäre bloß die Frage, wie ich das richtige Fenster finde. Der Titel der Applikation ist leider nicht fest, daher kann ich wohl nicht mit FindWindow() arbeiten, oder?
Delete - Sa 12.04.08 22:20
Hinterleg doch das Fensterhandle beim ersten Start in der Registry oder so.
alzaimar - So 13.04.08 09:31
Ich habe mir eine Fenster-Klasse geschrieben, die die Send- und Receive-Routine implementiert. Sender und Empfänger besitzen ein solches unsichtbares Fenster.
Um eine Nachricht zu verschicken, suche ich nun nach dem ANDEREN Fensterhandle und schicke diesem Handle per WM_COPYDATA die Nachricht. Der Receiver empfängt die Nachricht, kopiert sich in den eigenen Speicher und ruft dann einen Event auf.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!