aktuell baue ich an einer Anwendung, die auf einer Bibliothek aufsetzt. Dabei soll die Anwendung eigentlich nur ein Frontend für die Bibliothek sein (d.h. möglichst wenig eigener Code).
Dazu wollte ich in der Bibliothek ein paar Objekte erstellen, welche die gesamten Daten und die dazugehörigen Funktionen (= Sinn eines Objekts), enthalten. Die Bibliothek hätte dann jeweils eine procedure/function um die Objekte zu erstellen bzw. wieder frei zu geben. Ausgetauscht werden dabei dann die Pointer auf die Objekte.
Jetzt stellt sich mir jedoch die Frage, wie mein Frontend auf die Objekte zugreifen soll.
Mein erster Ansatz waren Funktionen in der Bibliothek, die die entsprechenden Objekt-Methoden aufrufen (das zu bearbeitende Objekt wird als Parameter übergeben). Damit hätte ich jedoch etliche Funktionen, die eigentlich nichts, außer Objekt-Methoden kapseln, machen. Dann wäre die schöne Objektorientierung aber hinfällig (-> ich habe nur Funktionen/Prozeduren).
Eine Variante davon wäre, eine zusätzliche Klasse zu erstellen, die die Funktionen kapselt, sodass im Frontend eine Klasse benutzt werden kann. Die Funktionen werden dann indirekt über eben diese Klasse aufgerufen.
Ein anderer Ansatz wären (hoffentlich) Interfaces. Mit denen habe ich jedoch nicht sehr viel Erfahrung und im Internet findet sich wenig über Objekte mit Interfaces, die zwischen verschiedenen Anwendungen (bzw. Bibliotheken) ausgetauscht werden.
Meine Versuche dahin gehend scheitern am Freigeben der Objekte.
Code: Alles auswählen
// erzeugt eine neue Instanz meiner Klasse
function CreateInterface: TInterfacedObject; stdcall; external 'lib1.dll';
// gibt eine Instanz meiner Klasse frei
procedure FreeInterface( AObject: TInterfacedObject ); stdcall; external 'lib1.dll';
// TInterfacedObject weil in Bibliothek und Anwendung vorhanden
var o: TInterfacedObject;
i: IBInterface; // so heißt mein Interface
begin
WriteLn('Trying to get Object');
// Objekt erzeugen
o := CreateInterface;
WriteLn('Got Object: ',IntToHex(PtrUInt(o),6));
// überprüfen, ob IBInterface unterstützt wird
if Supports(o, IGuid, i) then
begin
// eine Methode des Interfaces aufrufen
WriteLn('Result of ''IBInterface.GetInteger'': ',i.GetInteger);
end;
WriteLn('Trying to free interfaced object');
// objekt freigeben
FreeInterface(o);
WriteLn('Object freed');
ReadLn;
end;
Hat jemand hier Erfahrung mit Interfaces oder andere Ideen?
Was genau macht Supports? Ich konnte die Implementation nicht finden... Bzw. warum ist meine Objektvariable danach nicht mehr nutzbar?
MfG Die Socke
P.S. Der Roman zu meinem Problem wird demnächst überall im Handel verfügbar sein
