Dann nimm eben keine
DLL, sondern eine
BPL. [...]
Die muss man aber Installieren oder?
Nein, mit LoadPackage laden.
http://edn.embarcadero.com/article/27178
Was eine
DLL angeht, so müsstest du als Parameter auch Interfaces, z.B. abgeleitet von IUnknown, übergeben können. Denn die werden via
COM verwaltet. Also so ca., ungetestet:
Delphi-Quellcode:
library xyz;
uses
MyInterface;
procedure DoIt(AObject: ITest); stdcall;
begin
MessageBox(0, AObject.GetMsg, 'test', MB_ICONINFORMATION or MB_OK);
AObject.ShowMsg('Hallo');
end;
exports
DoIt;
Delphi-Quellcode:
unit MyInterface;
interface
type
ITest =
interface(IUnknown)
procedure ShowMsg(Value: PWideChar);
stdcall;
function GetMsg: PWideChar;
stdcall;
procedure SetMsg(Value: PWideChar);
stdcall;
end;
Benutzung:
Delphi-Quellcode:
uses
MyInterface;
type
TTest = class(TInterfacedObject, ITest)
private
FTest: string;
public
procedure ShowMsg(Value: PWideChar); stdcall;
function GetMsg: PWideChar; stdcall;
procedure SetMsg(Value: PWideChar); stdcall;
end;
procedure DoIt(AObject: ITest); stdcall; external 'xyz.dll';
implementation
function TTest.GetMsg: PWideChar;
begin
Result := PWideChar(FTest);
end;
procedure TTest.SetMsg(Value: PWideChar);
begin
FTest := Value;
end;
procedure TTest.ShowMsg(Value: PWideChar);
begin
ShowMessage(Value);
end;
Delphi-Quellcode:
var
Test: ITest;
begin
Test := TTest.Create;
Test.SetMsg('Hallöchen');
DoIt(Test);
Test := nil; // explizite Freigabe, nur nötig, wenn sonst der Scope zu groß wäre
Vielleicht hilft dir das ja dabei das so zu kapseln oder so.
// EDIT:
Also ich denke da an so etwas wie ein Interface, das du der
DLL übergibst und das in der Anwendung die Daten abruft und in Interface-Objekten der
DLL liefert