Autor Beitrag
error
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: 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



BeitragVerfasst: Sa 12.04.08 12:37 
Such mal nach Mutex und WM_COPYDATA.
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Sa 12.04.08 14:14 
Ok, was ich jetzt habe ist folgender Code in der Main-Form:

ausblenden 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 <> 0then
  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



BeitragVerfasst: Sa 12.04.08 15:55 
Wozu willst du denn den Mutex überwachen?
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: 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



BeitragVerfasst: Sa 12.04.08 22:20 
Hinterleg doch das Fensterhandle beim ersten Start in der Registry oder so.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.