Einzelnen Beitrag anzeigen

BAMatze

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

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 10:11
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
  Mit Zitat antworten Zitat