Einzelnen Beitrag anzeigen

Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: TCollection-Object streamen und/od. an anderen Prozess g

  Alt 23. Okt 2008, 19:24
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;
  Mit Zitat antworten Zitat