IHost = interface;
alle Funktionen/Ereignisse, welcher ein Plugin im Hauptprogramm aufrufen muß
THost = class(TObject, IHost);
das interne Objekt der Anwendung
IPlugin = interface;
die Schnittstelle zum Plugin, welche jedes Plugin implementiert
hier sind die Funktionen drinnen, welche die Anwendung im Plugin aufrufen muß/kann
TPlugin = class(TObject, IPlugin);
das interne Objekt des Plugins
Delphi-Quellcode:
function GetPlugin(Host: IHost): IPlugin; StdCall;
begin
Result := TPlugin.Create(Host);
end;
das wäre dann z.B. 'ne Funktion, welche die Plugin-
DLL exportiert, womit die Anwendung ihr Callback-Interface mitteilt und als Ergebnis das Interface zum Plugin bekommt.
Die Objekte bleiben in ihrem jeweiligem Bereich und der Andere (EXE/
DLL) bekommt immer nur das Interface
für den Stream
entweder TStreamAdapter, welcher irgendeinen Nachfahren von TStream kapseln kann (also auch TMemoryStream)
oder du leitest die TMemoryStream ab und implementierst selber das Interface
Delphi-Quellcode:
type
IDelphiStream = interface['{65805750-623E-4719-AD79-A30FF6FCA3CA}']
procedure SetSize(NewSize: Longint);
function Write(const Buffer; Count: Longint): Longint;
function Read(var Buffer; Count: Longint): Longint;
function Seek(Offset: Longint; Origin: Word): Longint;
procedure Clear;
//procedure LoadFromStream(Stream: IDelphiStream);
//procedure SaveToStream(Stream: IDelphiStream);
//procedure LoadFromFile(const FileName: WideString);
//procedure SaveToFile(const FileName: WideString);
property Position: Int64 read GetPosition write SetPosition;
property Size: Int64 read GetSize write SetSize64;
end;
TInterfacedMemoryStream = class(TMemoryStream, IDelphiStream);
nur die auskommentierten Methoden müßte man notfalls in TInterfacedMemoryStream noch implementieren, da sie vom "Original" abweichen.
> IDelphiStream ist klar, da man hier ja nicht kein TStream verwenden kann
> warum nicht IStream ... dessen definition weicht sehr stark von TStream ab
(IStream = Windows und TStream = Borland/Delphi)
> WideString ist der einzige StringTyp, welchen man ohne Einschränkung über Modulgrenzen (EXE-
DLL) hinweg nutzen kann (abgesehn von PChar, aber da muß man auch aufpassen und es geht nicht alles)