AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TCollection-Object streamen und/od. an anderen Prozess geben

TCollection-Object streamen und/od. an anderen Prozess geben

Ein Thema von Meta777 · begonnen am 22. Okt 2008 · letzter Beitrag vom 23. Okt 2008
Antwort Antwort
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TCollection-Object streamen und/od. an anderen Prozess geben

  Alt 22. Okt 2008, 00:05
huhu,

habe nun schon ne ganze weile gesucht aber für mein problem keine lösung gefunden: Ich will eine TCollection-descendant an einen anderen Prozess übergeben.
Mein erster Versuch war das Object über eine WM_CopyData zu übermitteln. Wenn ich jedoch in der in der Nachrichtenbehandlung auf das TCollection-Object zugreife gibts ne AV.

Was gibt es denn neben der (dp)Collection für möglichenkeiten eine Object zu exportieren (in einen Stream schreiben)?
Oder geht es vllt. doch mit WM_CopyData und ich stell mich nur zu doof an?

TIA

mein Versuch:
Der "Client"
Delphi-Quellcode:
var
  LCDStruct: TCopyDataStruct;
  LRes: Integer;
begin
  LRes := 0;

  LCDStruct.dwData := DAM_daLoad;
  LCDStruct.lpData := @ACollection;
  LCDStruct.cbData := SizeOf(ACollection);

  LRes := SendMessage(AHWnd, WM_COPYDATA, Application.Handle, Integer(@LCDStruct));
Der "Server"
Delphi-Quellcode:
procedure TfrmMain.WMCopyData(var Msg: TMessage);
begin
  MyActiveChild.MyColl.Assign(TMyCollection(PCopyDataStruct(Msg.LParam)^.lpData^)); <- Hier gibts ne AV
end;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

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

  Alt 22. Okt 2008, 07:49
Naja, du überginst ja nur nen Zeiger auf die Collection, deshalb versuchst du dann auch im 2. Prozess auf etwas zuzugreifen das nicht dir gehört.

Du müsstest schon erst die Collection streamen (z.B. in nen MemoryStream) und dann übergeben

Die dpCollection müsste bereits eine savetoStream-Methode haben, ansonsten: http://delphicikk.atw.hu/listaz.php?id=1361&oldal=32
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 23. Okt 2008, 19:16
hi,

habe nun versucht die Collection in ein MemoryStream zu schreiben. Soweit sogut. jedoch funktioniert das "Auslesen" nicht. Beim Server versuche ich folgendes:
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
end;
lpData zeigt immer auf eine andere Adresse als ich im Client angebe. Deswegen kracht es denn auch mit ner AV.
Der Cleint macht das:

Delphi-Quellcode:
var
  LCDStruct: TCopyDataStruct;
  LMS: TMemoryStream;
begin

  LMS := TMemoryStream.Create;
  try
    WriteCollection(LMS, ACollection);

    LCDStruct.dwData := DAM_daViewLoad;
    LCDStruct.lpData := @LMS;
    LCDStruct.cbData := LMS.Size;

    LRes := SendMessage(AHWnd, WM_COPYDATA, Application.Handle, Integer(@LCDStruct));
....
end;
weiß jmd. wo mein Fehler liegt?


Shalom
  Mit Zitat antworten Zitat
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
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 23. Okt 2008, 23:10
Danke!

Hatte einwenig gedauert bis ich herrausgefunden habe das ich den String mit .WriteString() wieder in den TStringStream schreiben muss...
Funzt jetzt super, sogar mit den Objekten und deren "Child"-Objekte in den Items (Hät ich nicht gedacht, dass das auf Anhieb klappt.)

Gottes Segen!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.
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