Das Interface trennt den Code und Speichermanager an der Grenze von
DLL und EXE,
also die enthaltene TStream-Instanz bleibt immer auf der Seite, wo das Interface erstellt wurde, selbst wenn das Interface in der anderen
DLL/EXE verwendet wird.
Klasseninstanzen lassen sich nunmal nicht im Bereich einer anderen
RTTI (ohne Shared-
RTTI aka BPLs) oder eines anderen Speichermanagers (ohne SharedMM) verwenden.
Einfaches Beispiel:
Du definierst in EXE und
DLL eine Klasse. (egal, ob das aus ein und der selben
Unit stammt, solange das jeweils einzeln einkompiliert wurde)
Delphi-Quellcode:
type
TMyClass = class
FStr: string;
FInt: Integer;
FXyz: Integer;
end;
Jetzt greifst du in einem der beiden Kompilate nicht auf FStr zu, weswegen der Compiler das wegoptimiert.
Somit steht in dem einem Kompilat an Adresse X das FStr, während im anderem Kompilat an der selben Adresse das FInt steht, da das FStr dort ja weggelassen wurde.
Greift man nun von der einen Seite auf das Objekt der anderen EXE/
DLL zu, dann erwischt man z.B. FInt, anstatt FStr, welches dann natürlich ein falsches Ergebnis liefert.
Das ist so, als wenn ich auf einer Straße ab der Hausnummer 6 alle Hausnummernschilder abschraube, die 6 weglasse und alles wieder um 1 versetzt anschraube.
Wenn du jetzt aus einem Paralleluniversum kommst und wie gewohnt in Hausnummer 13 rein willst, dann stehst du bei uns im falschen Haus.
(OK, der Vergleich hinkt ... eigentlich müsste ich das ganze Haus klauen und alle nachfolgenden Häuser entsprechend verschieben
)
[edit]
Oder anders erklärt:
- in einer der
DLL/EXE wurde das FStr wegoptimiert
- greift man nun auf FInt zu, dann liest man in Wirklichkeit das FXyz aus