Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Überarbeitung des eigenen Projektes Verbesserungen gesucht

  Alt 16. Sep 2009, 09:35
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
  Mit Zitat antworten Zitat