Hallo an alle
weiß das Thema wurde hier schon öfter mal behandelt, aber irgendwie hab ich noch nichts gefunden, was meine Fragen zum dynamischen Laden einer
DLL beantwortet. Also folgende Situation: Ich habe mehrere
DLL´s die ich bisher direkt lade. Hier ein kurzer Ausschnitt, damit ihr wißt, wie ich es mache:
Delphi-Quellcode:
const ExtLib_Verschiebetische = 'MMC.DLL';
function MMC_COM_open(portnumber,baudrate:integer):integer;
stdcall external ExtLib_Verschiebetische;
Also nichts weiter aufwendiges und funktioniert wunderbar. Allerdings möchte ich jetzt eine verherige überprüfung durchführen, ob sich die Datei in dem Verzeichnis befindet. Hier fangen jetzt meine Probleme an. Habe versucht dies anhand folgendem Threat zu programmieren:
dynamisches Laden einer URL
Da ich aber den genauen Namen nicht kenne, der in der Mitgelieferten
DLL verwendet wird, bekomme ich immer eine Fehlermeldung beim Laden einer Funktion aus der
DLL. Hier mal das, was ich bisher programmiert habe. Vieleicht ist nur ein Fehler in meinem Code, wenn ja bin ich schon zu betriebsblind
um ihn zu finden. Vieleicht hat jemand auch eine andere Idee, wie ich die Überprüfung durchführen kann, ohne die
DLL dynamisch zu laden.
Delphi-Quellcode:
unit VT_Funktionen;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
const maxComport = 100;
Bautrate = 9600;
type TV_Tische =
class
private
Tischbmp: TBitmap;
procedure Funktionenladen;
public
DLL_Handle: THandle;
bBewegung, bkalibriert: boolean;
iaktuelleTischposition, iZielTischposition, iComport: integer;
bAngeschlossen: boolean;
constructor create;
reintroduce;
destructor destroy;
override;
function VT_DLL_suche: boolean;
function VTischeverbinden: boolean;
end;
Type TVerbindenVT =
function (portnumber,baudrate:integer):integer;
stdcall;
//function MMC_COM_open(portnumber,baudrate:integer):integer;
{function MMC_COM_open(portnumber,baudrate:integer):integer; stdcall;
function MMC_COM_close:integer; stdcall;}
//function initialisieren_VT: integer;
Var VerbindenVT: TVerbindenVT;
implementation
constructor TV_Tische.create;
begin
inherited create;
bBewegung := false;
bkalibriert := false;
bAngeschlossen := false;
iComport := 0;
end;
procedure TV_Tische.Funktionenladen;
begin
try
@VerbindenVT := GetProcAddress(DLL_Handle, '
MMC_COM_open')
finally
showmessage('
Funktion konnte nicht geladen werden');
end;
end;
function TV_Tische.VTischeverbinden: boolean;
begin
try
if @VerbindenVT <>
nil then while (VerbindenVT(iComport, Bautrate) <> 0)
and (iComPort < maxComPort)
do
begin
iComport + 1;
end
finally
Showmessage('
Die Verbindungsfunktion konnte nicht geladen werden');
end;
end;
function TV_Tische.VT_DLL_suche: boolean;
begin
try
DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'
MMC.DLL'));
if DLL_Handle <> 0
then
begin
result := true;
Funktionenladen;
end
else result := false
except
result := false;
end;
end;
destructor TV_Tische.destroy;
begin
//FreeLibary(DLL_Handle);
inherited destroy;
end;
end.
Danke
BAMatze