Hallo,
Ich weiß, dass Objekte zwischen Anwendung und
DLL eigentlich nur per Interface geshared werden können/dürfen/sollen.
Folgende Situation:
Delphi-Quellcode:
TFoobar = class;
IFoobarKapselung = interface
['{B88AB8F5-1087-4496-84FA-54A37867DD47}']
function _Instance: Pointer;
// ...
end
TFoobarKapselung = class(TInterfacedObject, IFoobarKapselung)
FFooBar: TFoobar;
function _Instance: Pointer; // Gibt FFooBar zurück (bitte nicht hauen!)
// ..
end;
Meine Anwendung erstellt nun ein TFoobarKapselung und gibt es der
DLL in Form eines IFoobarKapselung.
Die
DLL benutzt das Object zu 90% auch indem es auf die Methoden des IFoobarKapselung-Interfaces zugreift.
Soweit so gut (erst mal).
In der
DLL wird aber eine Bibliothek benutzt, die eine TFoobar-Instanz benötigt.
Diese Bibliothek weiß natürlich nichts von meinem Interface (und will auch nichts davon wissen).
Von daher bleibt mir nichts anderes übrig als es so zu machen:
Delphi-Quellcode:
//
TBibliothekObj.Create(TFoobar(FoobarIntf._Instance))
FastMM4 hat sich zuerst beschwert dass Speicher der in der Anwendung reserviert wird in der
DLL freigegeben wird.
Meine super tolle Idee war der
DLL den MemoryManager der Anwendung zu übergeben. (GetMemoryManager (Anwendung)/SetMemoryManager (In der
DLL)).
Das schien im ersten Moment sogar zu funktionieren, aber jetzt habe ich wieder eine Zugriffsverletzung bei der ich ziemlich sicher bin,
dass diese durch die übergebenen Objektinstanzen (und folgender Speicherkorruption) verursacht wurden.
Daher habe ich, weise wie ich bin
beschlossen, dass ich ich auf dem Holzweg bin.
=============================
Jetzt ist die Frage: Wie löse ich das Problem?
Ich kann die Bibliothek nicht ändern - die erwartet ein TFoobar.
Aber ich kann der
DLL nur ein Interface geben..
Das muss doch irgendwie lösbar sein...
Hat jemand eine Idee, ein Workaround, ein Pattern, ein Irgendwas?