Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Datentransfer zwischen Programmen

  Alt 26. Jan 2019, 13:02
Wenn Du Daten per Message an eine andere Anwendung übergeben willst ist WM_COPYDATA die einzige generelle Methode, wie schon in einigen der anderen Antworten gesagt. Die Message bekommt von Windows eine Sonderbehandlung um die übermittelten Daten aus dem Addressbereich des Senders in den des Empfängers zu kopieren. Allerdings sollte man diese Message tunlichst nicht per BroadcastMessage an *alle* Fenster verschicken, sondern gezielt an dass Message-Handle des Empfängers.
Ich habe in meinem Archiv einen alten Post zu dem Thema gefunden, der Dir vielleicht den Einstieg erleichtert. Die Frage war damals, wie man für eine Anwendung, von der nur eine Instanz zur Zeit laufen soll, Parameter auf der Kommandozeile von einer 2. Instanz an die erste schickt, bevor die 2. sich beendet.


I take it you want to pass the commandline from a second instance of your program to the already running first instance.

Open the projects DPR file (Project|View source) and add this line immediately after the Begin of the main block:

If Alreadyrunning Then Exit;

Then scroll up and add this function after the Uses clause:

Function AlreadyRunning: Boolean;
Var
wnd: HWND;
S: String;
copydata: TCopyDataStruct;
Begin
wnd:= FindWindow('TMyAppsMainformclass', Nil );
Result := wnd <> 0;
If Result and (ParamCount > 0) Then Begin
S:= ParamStr(1);
With copydata Do Begin
dwData := 0;
cbData := Sizeof(Char)*(Length(S)+1); {Need to transfer terminating #0 as well}
lpData := @S[1];
End;
SendMessage( wnd, WM_COPYDATA, 0, LPARAM( @copydata ));
End;
End;

Note that you need to make sure the main form class for your application has a reasonably unique name, so FindWindow finds the correct window.

The second change needed is made to the main form class itself. It needs a handler for the WM_COPYDATA message.

private
{ Private declarations }
procedure WMCopyData(Var msg: TWMCopyData); message WM_COPYDATA;

Procedure TMyAppsMainformclass.WMCopyData(Var msg: TWMCopyData);
Var
param : String;
Begin
param := PChar(msg.CopyDataStruct^.lpData);
...process param
End;
Peter Below
  Mit Zitat antworten Zitat