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.


Gausi - So 13.04.08 09:58

Für solche Zwecke nutze ich die Unit OneInst, zu finden u.a. auf Luckies Seite [http://www.michael-puff.de/Developer/Delphi/Importe/Nico/]. Ist sehr einfach in der Anwendung und funktioniert einwandfrei.