Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Daten per Message übertragen (WM_COPYDATA?) (https://www.delphipraxis.net/72771-daten-per-message-uebertragen-wm_copydata.html)

DGL-luke 6. Jul 2006 14:52


Daten per Message übertragen (WM_COPYDATA?)
 
Hallo,

bin hier gerade munter am Proggen und weiß noch nicht mal, ob das so funktioniert, wie ich meine.

Ich versende Nachrichten, die einen Pointer auf ein bei mir liegendes struct (record) enthalten. kann das programm, das den Pointer empfängt, auf die Daten an der adresse zugreifen? Bzw. passiert bei WM_COPYDATA irgendetwas spezielles? Ich habe jetzt selbst definierte Nachrichten im Stil von WM_USER + xxx.

ste_ett 6. Jul 2006 14:54

Re: Daten per Message übertragen (WM_COPYDATA?)
 
Ja, das andere Programm kann auf den Speicher zugreifen. :)

Luckie 6. Jul 2006 14:55

Re: Daten per Message übertragen (WM_COPYDATA?)
 
WM_COPYDATA sorgt dafür, dass der Zeiger seine gültigkeit behält im fremden Prozess. Mit selbst definierten Nachrichten wird es nicht gehen.

DGL-luke 6. Jul 2006 14:57

Re: Daten per Message übertragen (WM_COPYDATA?)
 
aha... das sind jetzt zwei widersprüchliche informationen... oder bezieht sich deine aussage nur auf WM_COPYDATA, ste_ett?

ste_ett 6. Jul 2006 15:03

Re: Daten per Message übertragen (WM_COPYDATA?)
 
Zitat:

Zitat von DGL-luke
aha... das sind jetzt zwei widersprüchliche informationen... oder bezieht sich deine aussage nur auf WM_COPYDATA, ste_ett?

Die COPYDATA-Struktur beinhaltet einen Pointer auf eine Struktur, für die du Speicher geholt hast.
Diesen Pointer bekommt die Anwendung, an die du diese Fensternachricht schickst und kann dann darauf zugreifen.

DGL-luke 6. Jul 2006 15:31

Re: Daten per Message übertragen (WM_COPYDATA?)
 
ok, danke.

DGL-luke 6. Jul 2006 18:46

Re: Daten per Message übertragen (WM_COPYDATA?)
 
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ;) ) einen string/PChar/array of char von beliebiger Länge in das Struct? Es geht hier konkret um einen dateinamen, den könnt ich natürlcih kurz halten, aber unbegrenzt wär schon schöner... Ich nehme mal an, ein PChar in meinem record würd irgendwo in meinen Adressraum zeigen, und der Zielapp nix anderes als AVs bescheren...

Christian Seehase 6. Jul 2006 19:57

Re: Daten per Message übertragen (WM_COPYDATA?)
 
Moin Lukas,

schau Dir mal das letzte Element der Struktur an.

DGL-luke 6. Jul 2006 19:59

Re: Daten per Message übertragen (WM_COPYDATA?)
 
ja klar, das ist ein pointer auf die daten, die ich übertragen will.

ich will aber einen record übertragen und in diesem record wiederum einen string. ohne größenbeschränkung wie z.B. string[255] oder array[0..1023] of char.

EDIT: Ich könnte da natürlich ganz frech hergehen und mit Getmem und copy arbeiten, aber das will ich eigentlich nicht. genauso empfände ich es als unschön, zwei messages, eine mit den primitiven informationen und eine mit dem string zu senden.

TStringlist 6. Jul 2006 20:13

Re: Daten per Message übertragen (WM_COPYDATA?)
 
Zitat:

Zitat von DGL-luke
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ;) ) einen string/PChar/array of char von beliebiger Länge in das Struct?

Die dabei mögliche Länge scheint nicht limitiert zu sein. In einem kleinen WM_CopyData-TestProg jedenfalls konnte ich seinerzeit locker den Inhalt eines TMemoryStreams versenden bzw. empfangen. Im Detail war das dann wieder der Inhalt eines RichEdit-Controls mit eben auch durchaus mehr als 255 (etc.) Characters:


Delphi-Quellcode:
// Sende-Proc in einem "Prog A"
procedure TForm1.SendTextViaWMCopyData(Sender: TObject);
var AStream : TMemoryStream;
    ACopyDataStruct : TCopyDataStruct;
begin
  AStream := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(AStream);

  with ACopyDataStruct do begin
    dwData := 0;
    cbData := AStream.Size;
    lpData := AStream.Memory;
  end;

  SendMessage(FindWindow(Nil,'Prog B'), WM_CopyData, Handle, integer(@ACopyDataStruct));
  AStream.Free;
end;


// Empfangs-Proc in einem "Prog B"
procedure TForm1.GetTextViaWMCopyData(var AMsg : TMessage);
type PCopyDataStruct = ^TCopyDataStruct;
var AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  AStream.Write(PCopyDataStruct(AMsg.LParam).lpData^,PCopyDataStruct(AMsg.LParam).cbData);
  AStream.Position := 0;
  RichEdit2.Lines.LoadFromStream(AStream);
  AStream.Free;
end;
edit: die Empfangs-Proc ist natürlich eine Botschaftsbehandlungsroutine für WM_COPYDATA-Messages (die also auch entsprechend im Deklarationsteil der Form so zu deklarieren ist).


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz