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