Ich bin gerade dabei, zu lernen, wie man
dll dynamisch lädt, damit ich meinem Program Plugins zur verfügung stellen kann. Aus einem Tutorial habe ich mir das gebastelt:
Der aufruf im Hauptprogramm (die unwichtigen Teile entfernt):
Delphi-Quellcode:
procedure TfrmMain.FormClick(Sender: TObject);
var hDLL : THandle;
dllName : PAnsiChar;
aHeight : Integer;
TopLeft : TPoint;
Start : procedure(aHandle : THandle; var aHeight : Integer; aTopLeft : TPoint);
begin
//ShowMessage(dllName);
hDLL := LoadLibrary(dllName);
if hDLL <> 0 then begin
try
Start := GetProcAddress(hDLL, 'Start');
Start(frmMain.Handle, aHeight, TopLeft); //<-bei diesem Schritt tritt der Fehler auf
finally
FreeLibrary(hDLL);
end;
end;
end;
end;
Und der
dll-Code:
Delphi-Quellcode:
library about;
uses
Forms, ShareMem, Types,
uAbout in 'uAbout.pas' {fAbout};
{$R *.res}
procedure start(aHandle : THandle; var aHeight : Integer; aTopLeft : TPoint);
begin
fAbout := TfAbout.Create(nil);
fAbout.ParentWindow := aHandle;
aHeight := fAbout.Height;
fAbout.Left := aTopLeft.X;
fAbout.Top := aTopLeft.Y;
fAbout.BorderStyle := bsNone;
fAbout.BorderWidth := 0;
fAbout.Width := 225;
fAbout.Show;
end;
procedure ende;
begin
fAbout.Free;
end;
exports
start name 'start',
ende name 'ende';
end.
Ich habe mal versucht, den Code der
dll direct als
Unit einzubinden. Das hat auch funktioniert. Und ich habe keine Fehlermeldung erhalten.
Die Fehlermeldung hab ich mal angehängt