Hallo und guten Morgen an alle,
Ich bin gerade dabei mein Projekt zu überarbeiten und vorallem Verbesserungen im Quellcode (Optimierung) durchzuführen. Erhoffe mir dadurch einen konstanteren Programmablauf. Derzeit ist gerade problematischen, dass Kommunikationen über virtuelle Comports ab und zu blockieren und somit die Maschine an der ich arbeite, selber nicht arbeiten mag
. Gut nun zur Frage: Ich verwende mehrere Klassen, wobei jedes Gerät an der Maschine seine eigene Klasse hat, in der die entsprechenden
DLL´s geladen werden und so weiter. Hier möchte ich Verbesserungen bewirken (vorallem die try-except-finally-Blöcke RICHTIG setzen). Das laden der
DLL-Funktionen erfolgt dabei dynamisch wie folgt:
Delphi-Quellcode:
function TControlerBoard.DLLHandle_zuweisen: boolean;
begin
doFehlerevent(300);
// Fehlerevent teilt einer Fehlerklasse mit, dass versucht wird das DLL-Handle zu finden
try
ControlerDLL := TDLL_Datei.create('
K8055D.DLL');
// eine Dateiklasse, welche auf dem gesamten Rechner nach der angegebenen DLL sucht, in dieser Klasse wird das LoadLibary ausgeführt und mit der Variable ControlerDLL.Handle später an die TControlerBoard.DLL_Handle zugewiesen
try
result := ControlerDLL.Vorhanden;
//ist true, wenn die DLL auf dem Rechner gefunden wurde
// Handlezuweisung bei true, Fehlerhandling bei false
case result
of
true: DLL_Handle := ControlerDLL.Handle;
false:
begin
doFehlerevent(301);
DLL_Handle := 0;
end;
end;
except
// bei Fehler Fehlerhandling und Free der DLL-Klasse
doFehlerevent(302);
result := false;
end;
finally
// Beenden der Klasse
ControlerDLL.Free;
end;
//Protokoll.Protokolleingang('ControlerBoard', 'DLLHandle-Fkt');
end;
function TControlerBoard.DLLFunktionen_laden: boolean;
begin
//Protokoll.Protokolleingang('ControlerBoard', 'DLL-Fkt laden');
try
if DLL_Handle <> 0
then
begin
@OpenDevice := GetProcAddress(DLL_Handle, '
OpenDevice');
@CloseDevice := GetProcAddress(DLL_Handle, '
CloseDevice');
@ClearAllAnalog := GetProcAddress(DLL_Handle, '
ClearAllAnalog');
@ClearAllDigital := GetProcAddress(DLL_Handle, '
ClearAllDigital');
@ClearAnalogChannel := GetProcAddress(DLL_Handle, '
ClearAnalogChannel');
@ClearDigitalChannel := GetProcAddress(DLL_Handle, '
ClearDigitalChannel');
@OutputAnalogChannel := GetProcAddress(DLL_Handle, '
OutputAnalogChannel');
@SetDigitalChannel := GetProcAddress(DLL_Handle, '
SetDigitalChannel');
@ReadDigitalChannel := GetProcAddress(DLL_Handle, '
ReadDigitalChannel');
@ReadAnalogChannel := GetProcAddress(DLL_Handle, '
ReadAnalogChannel');
result := true;
Eingangswaechter := TControlCardControlThread.create(Form1.Handle);
end
else
begin
doFehlerevent(303);
result := false;
end
except
doFehlerevent(304);
result := false;
end;
//Protokoll.Protokollausgang('ControlerBoard', 'DLL-Fkt laden');
end;
Bei der ersten Funktion habe ich schon versucht mich an die hier in der
DP geposteten Konvention für try-except-finally zu halten(ist eventuell noch nicht perfekt). Bei der 2 Funktion hab ich jetzt aber noch eine Frage:
Die try-except-Kapslung dort ist mir bewusst, dass sie falsch verwendet wird. Hatte sie damals verwendet, weil ich noch nicht so viel Ahnung hatte. Die Frage ist nun auch in Hinblick auf Assarbads Tutorial für
DLL´s, ist hier die Verwendung sinnvoll? Wenn das
Handle vorhanden ist, dann kenne ich ja über die Dokumentation der
DLL, die Namen und bin mir eigentlich sicher, dass sie geladen werden. Das einzige Szenario, welches hier zum tragen kommen könnte, wäre ja eigentlich, dass irgendjemand irgendeiner Datei den
DLL-Namen gibt. Dann würde ich, falls dann das Loadlibary noch funktioniert doch eigentlich nur einen Pointer auf Null (gemäß
OH) bekommen bei den GetProcAddress-Funktionen. Also nix was wirklich zu einer
Exception führen sollte (denke ich).
Wenn ich also meine Funktion wie folgt abändere:
Delphi-Quellcode:
//Protokoll.Protokolleingang('ControlerBoard', 'DLL-Fkt laden');
if DLL_Handle <> 0
then
begin
@OpenDevice := GetProcAddress(DLL_Handle, '
OpenDevice');
@CloseDevice := GetProcAddress(DLL_Handle, '
CloseDevice');
@ClearAllAnalog := GetProcAddress(DLL_Handle, '
ClearAllAnalog');
@ClearAllDigital := GetProcAddress(DLL_Handle, '
ClearAllDigital');
@ClearAnalogChannel := GetProcAddress(DLL_Handle, '
ClearAnalogChannel');
@ClearDigitalChannel := GetProcAddress(DLL_Handle, '
ClearDigitalChannel');
@OutputAnalogChannel := GetProcAddress(DLL_Handle, '
OutputAnalogChannel');
@SetDigitalChannel := GetProcAddress(DLL_Handle, '
SetDigitalChannel');
@ReadDigitalChannel := GetProcAddress(DLL_Handle, '
ReadDigitalChannel');
@ReadAnalogChannel := GetProcAddress(DLL_Handle, '
ReadAnalogChannel');
end;
result := (@OpenDevice <>0)
and (@CloseDevice <>0)
and (@ClearAllAnalog <>0)
and
(@ClearAllDigital <>0)
and (@OutputAnalogChannel <>0)
and (@SetDigitalChannel <>0)
and
(@ReadDigitalChannel <>0)
and (@ReadAnalogChannel <>0)
and (@ClearAnalogChannel <>0)
and
(@ClearDigitalChannel <>0);
if not result
then doFehlerevent(303);
//Protokoll.Protokollausgang('ControlerBoard', 'DLL-Fkt laden');
sollte diese doch in Ordnung sein oder sehe ich das jetzt total falsch oder ist eine try-except-finally-Verwendung irgendwo doch empfehlenswert?
Vielen Dank
BAMatze
2. Account Sero