Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Klasseninstanz an DLL-Funktion übergeben (TStrings)

  Alt 1. Jan 2007, 20:36
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat