Zitat:
mußt/darfst du auch nicht, denn diese Methode ruft jede "Programmiersprache" auf, wenn da eine Variable ala Interface-Referenz entfernt/freigeeben wird.
Dann lese dir mal den Thread bei Delphi-Treff durch, da habe ich das auch durchdiskutiert.
In diesen Thread - so denke ich jedenfalls - gehört diese Diskussion nicht.
Zitat:
du darfst dann nur dein Objekt nicht von TInterfacedObject oder einem seiner Nachfolger ableiten,
sondern mußt die Methoden für IInterface/IUnknown selber implementieren, bzw. diese Basisklasse verwenden:
Schon klar, so habe ich es auch gemacht (siehe Quelltext des Plugin-Systems).
Bzw. damit sich die Diskussion hat, das Problem nochmal auf den Knackpunkt gebracht:
(abgekürzter Delphi-Code)
In der
DLL:
Delphi-Quellcode:
func ExportIntf: IIntf; //exportiert
Result := TITestImpl.Create;
In der Anwendung:
Delphi-Quellcode:
DLL.LoadLib;
Intf :=
DLL.ExportIntf
as ITest;
Intf :=
nil;
DLL.FreeLib;
In dem Beispiel knallt es am Ende (ganz am Ende der Prozedur). Warum? Weil bei dem as-Cast eine temporäre Interface-Referenz entsteht, von der erst am Ende _Release aufgerufen wird - zu diesem Zeitpunkt wurde die
DLL mitsamt des Objekts aber schon längst aus dem Speicher entfernt -> es knallt.
Henning D.