In meinem jetzigen Projekt habe ich ein ähnlichenen Sachverhalt. Er funktioniert anscheinend so, wie ich es möchte (er meckert, wenn die
DLL nicht vorhanden ist und akzeptiert sie, wenn sie vorhanden ist. Hier mal der Quellcode:
Meine Klasse für
DLL
Delphi-Quellcode:
Type TDLL_Datei =
class
private
bDLL_vorhanden: boolean;
sDLLName:
string;
hDLLHandle: THandle;
function DLL_vorhanden: boolean;
public
constructor create(
const sDateiName:
string);
reintroduce;
destructor Destroy;
override;
property Vorhanden: boolean
read bDLL_vorhanden;
property Handle: THandle
read hDLLHandle;
end;
...
constructor TDLL_Datei.Create(
const sDateiName:
string);
begin
inherited create;
sDLLName := sDateiName;
bDLL_vorhanden := DLL_vorhanden;
end;
function TDLL_Datei.DLL_vorhanden: boolean;
var DLL_Handle: THandle;
begin
try
DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+ '
DLL\'+sDLLName));
if DLL_Handle <> 0
then
begin
hDLLHandle := DLL_Handle;
result := true;
end
else result := False
except
result := false;
end;
end;
destructor TDLL_Datei.Destroy;
begin
inherited Destroy;
end;
Und so überprüfe ich sie (habe mir für jedes Gerät eine eigene Klasse geschrieben (hier ein Auszug davon)
Delphi-Quellcode:
type TV_Tische =
class
Fehlerevent: TFehlerevent;
private
// Deklaration aller verwendeten Variablen die nur intern in dieser Unit
// verwendet werden können
//Tischbmp: TBitmap;
TischDLL: TDLL_Datei;
...
end;
// Typdeklaration für die aus der dynamisch eingebundenen MMC.DLL zu ladenen
// Funktionen.
type TMMC_COM_open =
function(portnumber,bautrate: integer):integer;
stdcall;
type TMMC_close =
function: integer;
stdcall;
type TMMC_sendCommand =
function(pCmd: pChar): integer;
stdcall;
type TMST_moving =
function: integer;
stdcall;
type TMMC_setDevice =
function(NewAxis: integer): integer;
stdcall;
// Variablendeklaration der aus der dynamisch eingebundenen MMC.DLL zu ladenen
// Funktionen
var MMC_COM_open: TMMC_COM_open;
MMC_close: TMMC_close;
MMC_sendCommand: TMMC_sendCommand;
MST_moving: TMST_moving;
MMC_setDevice: TMMC_setDevice;
...
function TV_Tische.DLLHandle_zuweisen: boolean;
begin
//Protokoll.Protokolleingang('Verschiebetisch', 'DLLHandle-Fkt');
Fehlermeldung(100);
try
TischDLL := TDLL_Datei.create('
MMC.DLL');
if TischDLL.Vorhanden
then
begin
DLL_Handle := TischDLL.Handle;
result := true;
end
else
begin
Fehlermeldung(101);
DLL_Handle := 0;
result := false;
end
except
Fehlermeldung(102);
result := false;
end;
//Protokoll.Protokollausgang('Verschiebetisch', 'DLLHandle-Fkt');
end;
function TV_Tische.DLLFunktionen_laden: boolean;
begin
//Protokoll.Protokolleingang('Verschiebetisch', 'DLL-Fkt laden');
try
if DLL_Handle <> 0
then
begin
// Es wurde festgestellt, dass nicht alle Funktionen, die in der DLL vorhanden
// sind wirklich für die Umsetzung des Programmes benötigt werden. Deswegen
// werden hier nur die wirklich verwendeten Funktionen eingebunden, um auch die
// Resourcen für das Programm zu beschränken
@MMC_COM_open := GetProcAddress(DLL_Handle, '
MMC_COM_open');
@MMC_close := GetProcAddress(DLL_Handle, '
MMC_close');
@MMC_sendCommand := GetProcAddress(DLL_Handle, '
MMC_sendCommand');
@MST_moving := GetProcAddress(DLL_Handle, '
MST_moving');
@MMC_setDevice := GetProcAddress(DLL_Handle, '
MMC_setDevice');
result := true;
end
else
begin
Fehlermeldung(103);
result := false;
end
except
Fehlermeldung(104);
result := false;
end;
//Protokoll.Protokollausgang('Verschiebetisch', 'DLL-Fkt laden');
end;
Also dies funzt bei mir eigentlich gut. Falls es natürlich Verbesserungsvorschläge hat, bin ich immer für offen. Dort wo die Fehlermeldungen in meinem Code stehen werden Meldungen ausgegeben, so dass ich weiß, was los ist.
Hoffe das hilft dir etwas.
BAMatze