Wenn ich da nichts übersehe, machst du da einen Pointer auf nil. TestFunc ist mit nil initialisiert und so führt @nil zu einer
Access Violation. Also einfach das @ entfernen und es sollte gehen.
TestFunc := GetProcAddress(DllHandle, 'TestFunc');
Warum importierst du die Funktion nicht einfach wie folgt. So brauchst du das ganze Load/FreeLibrary Zeugs nicht. Deine
DLL muss ja eh immer vorhanden sein. Also macht es keinen Sinn, diese zur Runtime als Latebinding zu laden. Mit dieser Art der
DLL Einbindung, wird die
DLL automatisch beim Programmstart geladen. Ist also deutlich einfacher.
Delphi-Quellcode:
{...Unit, Interface, Uses, TForm1...}
function TestFunc(): Boolean;
var
Form1: TForm1;
DllHandle: THandle;
implementation
{$R *.dfm}
{...Funktionen...}
procedure TForm1.Button2Click(Sender: TObject);
begin
TestFunc;
end;
{...Funktionen...}
function TestFunc;
external '
ProjectDLL.dll'
name '
TestFunc';
{ Das brauchst du in diesem Fall nicht, da die DLL durch die obige Deklaration automatisch beim Programmstart geladen wird.
initialization
if DllHandle = 0 then begin
DllHandle := LoadLibrary('ProjectDLL.dll');
if DllHandle <= 0 then begin
MessageDlg('ProjectDLL.dll steht nicht zur Verfügung',
mtInformation, [mbOK], 0);
end;
end;
finalization
if DLLHandle <> 0 then
FreeLibrary(DLLHandle);
}
end.
Lies dir mal in der Hilfe die Beschreibung zu "external":
http://docwiki.embarcadero.com/RADSt...tions_(Delphi)