Guten Abend,
Ich bastle mir gerade eine Anwendung die in der Lage sein soll,
DLL's dynamisch und auch Statisch mit ein zu binden.
Das alles ist dank der vielen Tutorials hier kein Problem gewesen. Ich habe mir dazu eine Demo Applikation gebastelt die ungefähr wie folgt aussieht :
HOST:
Delphi-Quellcode:
(*
Statisch eingebundene Procedure
*)
Procedure ShowSomething(Value: Pchar);
stdcall;
external '
fst.dll';
(*
Dynamisch
*)
Type
TDLLProcedure =
Procedure(Value: Pchar);
stdcall;
Var
DLLProcedure: TDLLProcedure;
hDLL: THandle = 0;
Procedure LoadDLL_(DLLName:
String);
Var
buf:
Array[0..144]
Of char;
Begin
If hdLl <> 0
Then unloadDLL_;
hDLL := LoadLibrary(StrPCopy(buf, dllname));
If hDLL <> 0
Then Begin
Try
@DLLProcedure := GetProcAddress(hdll, StrPCopy(buf, '
ShowSomething2'));
(*
warum wird hier auf @DLLProcedure geprüft und nicht auf
DLLProcedure ??
*)
If @DLLProcedure =
Nil Then
Raise Exception.create('
Error could not find Routine.');
Except
FreeLibrary(hDLL);
hdll := 0;
Raise;
End;
End
Else
Raise Exception.Create('
Unable to load DLL.');
End;
Procedure UnloadDLL_;
Begin
If hDLL <> 0
Then Begin
FreeLibrary(hDLL);
hdll := 0;
DLLProcedure :=
Nil;
End;
End;
So weit so gut, und das gezeigt funktioniert auch wunderbar.
Ich weis jetzt allerdings schon das später, in Ferner Zukunft meine
DLL's durch
DLL's ausgetauscht werden, welche in C, oder C++ geschrieben werden.
Und laut Delphi hilfe mus ich die Deklarationen dann anders schreiben, da ist die Rede von dem wörtchen "cdecl"
Nun die Frage , wie mus ich den Source in der Host Anwendung anpassen, bzw was mus ich meinen Bisherigen
DLL's ändern damit das dann alles geht wie ichs mir vorstelle ?
Also sowohl der Statische Teil, wie auch das Dynamische Laden wird später mit den C
DLL's sein.
Eigentlich klar, aber hier noch mal gezeigt, mein source aus den
DLL's
Delphi-Quellcode:
Procedure ShowSomething(Value: Pchar); stdcall;
Var
s: String;
Begin
s := String(Value);
showmessage('snd.dll:' + #13#10 + s);
End;
Procedure ShowSomething2(Value: Pchar); stdcall;
Var
s: String;
Begin
s := String(Value);
showmessage('snd.dll:' + #13#10 + s);
End;
Exports
ShowSomething,
ShowSomething2;
Begin
End.