Ja, ich
Du benutzt nun einen MemoryStream statt der Collection. Schonmal auf dem richtigen Weg.
Aber du übergibst einen Pointer auf einen Pinter auf den Stream. (Ein Objekt ist bereits ein Pointer und @LMS ...
)
Versuch mal
Delphi-Quellcode:
var
LCDStruct: TCopyDataStruct;
LMS: TMemoryStream;
begin
LMS := TMemoryStream.Create;
try
WriteCollection(LMS, ACollection);
LCDStruct.dwData := DAM_daViewLoad;
LCDStruct.lpData := Pointer(LMS);
LCDStruct.cbData := LMS.Size;
LRes := SendMessage(AHWnd, WM_COPYDATA, Application.Handle, Integer(@LCDStruct));
....
end;
Und dann
Delphi-Quellcode:
procedure TfrmMain.WMCopyData(
var Msg: TWMCopyData);
var
LMS: TMemoryStream;
begin
LMS := TMemoryStream(Msg.CopyDataStruct^.lpData); <- lpData zeigt wo anders hin!??
LMS.Position := 0; <-
AV
// LMS ist Read-Only und temporär ==> Evtl. Kopie machen
end;
Edit: Wobei das auch nicht funktionieren dürfte - denn der Objektzeiger zeigt sicherlich nicht direkt auuf den Stream ..
Du solltest also nur die eigentlichen daten verschicken.
Benutze TStringStream, da kannst du dann diirekt den String verschicken
Delphi-Quellcode:
var
LCDStruct: TCopyDataStruct;
LMS: TStringStream;
begin
LMS := TStringStream.Create('');
try
WriteCollection(LMS, ACollection);
LCDStruct.dwData := DAM_daViewLoad;
LCDStruct.lpData := PChar(LMS.getString) // oder so
LCDStruct.cbData := LMS.Size;
LRes := SendMessage(AHWnd, WM_COPYDATA, Application.Handle, Integer(@LCDStruct));
....
end;