AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Übergabe von Listen an DLL ohne Kopie zu erstellen.
Thema durchsuchen
Ansicht
Themen-Optionen

Übergabe von Listen an DLL ohne Kopie zu erstellen.

Ein Thema von Ookami · begonnen am 2. Jan 2012 · letzter Beitrag vom 2. Jan 2012
Antwort Antwort
snook

Registriert seit: 25. Jun 2010
94 Beiträge
 
Delphi 2005 Professional
 
#1

AW: Übergabe von Listen an DLL ohne Kopie zu erstellen.

  Alt 2. Jan 2012, 17:02
Hmm das ist nciht ganz so einfach in Delphi, da jede DLL für sich erstmal ihren eigenen Speichermanager, VCL... mitbringt. Das heisst wenn du ne Klasse in eine DLL rüberschieben willst, dann sieht die compilierte Klasse in der DLL mitunter ganz anders aus als im Hauptprogramm. Wenn du dann in die DLL eine Referenz auf ein Objekt aus dem Hauptprogramm übergibst, können schon einfache Aufrufe krachen. Daher in solchen Fällen immer interfaces benutzen.
Das gleiche gilt dann bei strings, die besitzen ne interne Referenzzählung, die du völlig über den Haufen wirfst, wenn du einen string in eine DLL übergibst, daher nehme ich PChars. Es gibt allerdings auch Ausnahmen. Da müsstes du mal nach Runtimepackages suchen, gegebenenfalls hilft dir auch ein anderer Speichermanager, wie zum Beispiel FastMM4

im einfachsten Fall, bei dem in der DLL weisst von welchem Datentyp die Einträge in der Liste sind, kannst du dir einfach ne Wrapper klasse bauen, der du im Create die Liste übergibst. Wenn diese Wrapperklasse nun ein interface unterstützt, mit dem du auf die die Elemente der Liste zugreifen kannst, dann geht das auch so.

also in etwa:

Delphi-Quellcode:
PMyRecord = ^TMyRecord;
TMyRecord = packed record
  A: integer;
  B: boolean;
end;

IMyRecordWrapper = interface(IUnknown)
  procedure SetValue(AIndex: integer; ANewRecord: PMyRecord); stdcall;
  function GetValue(AIndex: integer): PMyRecord; stdcall;
end;

TWrapMyRecordList = class(TInterfacedObject, IMyRecordWrapper)
private
  FMyList: TList;
public
  constructor Create(AWrappedList: TList); reintroduce; virtual;
  procedure SetValue(AIndex: integer; ANewRecord: PMyRecord); stdcall;
  function GetValue(AIndex: integer): PMyRecord; stdcall;
end;
EDIT\\ da kannst du dann im GetValue/SetValue auch gleich bei Änderungen die Anzeige updaten oder ähnliches...
EDIT EDIT\\ und sry falls ich dich erschlagen hab, dachte mir wenn du sowas machen willst, dann hilft es dir vielleicht das ganze gleich so allgemein wie möglich zu halten, so dass du das später auch mal anderer Stelle verwenden kannst

Geändert von snook ( 2. Jan 2012 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Ookami
Ookami

Registriert seit: 20. Nov 2009
Ort: Baden Württemberg
77 Beiträge
 
Delphi 2009 Architect
 
#2

AW: Übergabe von Listen an DLL ohne Kopie zu erstellen.

  Alt 2. Jan 2012, 18:31
Thx,

Hmm das ist nciht ganz so einfach in Delphi, da jede DLL für sich erstmal ihren eigenen Speichermanager, VCL... mitbringt. ...
Die Problematik ist mir bekannt. Daher knallt es auch regelmäßig, wenn man z.B. einen Typ TFont direkt an eine DLL übergeben will.
Wie gesagt, was mein Problem anbelangt bin ich da von C# verwöhnt und du weißt ja, wie das so ist, da kennt man was in der einen Sprache und versucht dann immer wieder verzweifelt ein Gutes aus der einen Sprache in einer anderen auch anzuwenden.
Wenn mir Delphi aufgrund seiner Struktur nicht so ans Herz gewachsen wäre...

Daher werde ich mich in den kommenden Tagen durch deine Snippets wühlen. Erklärt hast du ja gut, daher nochmal Danke.

Bin aber weiterhin immer Dankbar für weitere Tipps in der Richtung. Könnte ja auch für andere interessant sein.

Grüße
Wolfgang
Grüße und Danke
Wolfgang
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz