Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DLL - Objekte austauschen

  Alt 19. Dez 2018, 15:07
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?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat