Autor |
Beitrag |
error
      
Beiträge: 64
|
Verfasst: Sa 12.04.08 11:46
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!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 12.04.08 12:37
Such mal nach Mutex und WM_COPYDATA.
|
|
error 
      
Beiträge: 64
|
Verfasst: 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?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 12.04.08 15:55
Wozu willst du denn den Mutex überwachen?
|
|
error 
      
Beiträge: 64
|
Verfasst: Sa 12.04.08 16:18
Um die Daten zu empfangen, die von einer anderen Instanz gesendet werden... oder versteh ich da was falsch?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 64
|
Verfasst: 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?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 12.04.08 22:20
Hinterleg doch das Fensterhandle beim ersten Start in der Registry oder so.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 13.04.08 09:58
Für solche Zwecke nutze ich die Unit OneInst, zu finden u.a. auf Luckies Seite. Ist sehr einfach in der Anwendung und funktioniert einwandfrei.
_________________ We are, we were and will not be.
|
|