Herzlichen Dank - komplett Verstanden aber da wäre ich nie selber drauf gekommen. Interfaces sind nützlicher als gedacht! Ich habe zum test mal folgendes programmiert:
Delphi-Quellcode:
//Hauptanwendung schickt ein Bild in einem Memorystream an DLL:
procedure TForm1.Button1Click(Sender: TObject);
var app:tapp;
astream:TInterfacedMemoryStream;
begin
app:=tapp.create;
StartPlugin('
P_DLL.dll',app);
//Sucht Procedur "LoadPlugin" in der DLL und übergibt den Zeiger auf APP an das Plugin.
//Der Zeiger auf TPlugin wird in PluginList gespeichert.
showmessage('
GetName: '+PluginList[0].Getname);
//Funktioniert einwandfrei
astream:=TInterfacedMemoryStream.Create;
astream.LoadFromFile('
C:\Autumn Leaves.jpg');
PluginList[0].ReceiveStream(astream);
end;
Delphi-Quellcode:
//DLL erhält Stream korrekt und schickt ihn direkt mal wieder zurück an Hauptanwendung (einfach nur als Test der "Durchgängigkeit"):
procedure TPlugin.ReceiveStream(aStream: IDelphiStream);
stdcall;
begin
App.AddStream(astream);
end;
Delphi-Quellcode:
//Hauptanwendung erhält Stream wieder zurück:
procedure TApp.AddStream(aStream: IDelphiStream); stdcall;
begin
TInterfacedMemoryStream(astream).position:=0;
TInterfacedMemoryStream(astream).SaveToFile('C:\test2.jpg');
end;
Allerdings wird bei "TInterfacedMemoryStream(astream).position:=0; " eine
Access Violation hervorgerufen, die ich noch nicht verstehe.
Hast du da evtl noch eine Idee?