Einzelnen Beitrag anzeigen

snook

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

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

  Alt 2. Jan 2012, 18: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 18:07 Uhr)
  Mit Zitat antworten Zitat