Ich habe gerade kein Delphi hier. (hier <> @home
)
Muss mir das also etwas aus den Fingern saugen....
Was Bernhard da angesprochen hat lässt sich auch ohne
COM realisieren. Delphi Interfaces erfüllen die
COM-Pflichten, sie sind also binär kompatibel zueinander. Auch wenn du sie in 2 Binaries kompilierst (Deine Echse und die
DLL).
Du benutzt in der Methode oben eigentlich nur die Methode Add von TSTrings. Das Interface was man hier braucht müsste also nur die Methode Add besitzen:
Delphi-Quellcode:
type
IStringList = interface(IUnknown)
['bli-bla-blubb'] //hier ctrl+g drücken ;)
function Add(const aString : String) : Integer;
end;
Solange Delphi mit Delphi in der gleichen Version "redet" kann man String benutzen, solange ShareMem/FastMM als erste
Unit in der
DLL und in der Echse verwendet wird.
Die StringList version, die du in der Echse benutzt, muss natürlich noch das Interface implementieren.
Da ich (hoffentlich) die gleiche Signatur der Methode in dem Interface habe, wie sie bereits in TStrings deklariert ist, sollte das ziemlich easy sein:
Delphi-Quellcode:
type
TMyStringlist = class(TStringList , IStringList)
private
fStringList : TStringList;
protected
// hier die Methoden von System.TInterfacedObject reinkopieren
public
constructor Create;
destructor Destroy; override;
end;
...
constructor TMyStringlist.Create;
begin
fStringList := TStringList.Create();
end;
destructor TMyStringlist.Destroy;
begin
fStringList.Free();
end;
Die
Unit mit dem Interface kannst du in Echse und
DLL benutzen. Die TMyStringList sollte aber niemals direkt zwischen den beiden übergeben werden sondern nur als Referenz auf IStringList.
Wenn du es übergibst, sollte der Parameter immer schön als "const" übergeben werden. Dadurch findet keine Referenzzählung statt und Delphi wird dir beim erreichen der 0 nicht die Instanz töten, obwohl du damit wahrscheinlich noch arbeiten willst.