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).