Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prüfen ob dll vorhanden ist (https://www.delphipraxis.net/130731-pruefen-ob-dll-vorhanden-ist.html)

steewan 12. Mär 2009 09:40


Prüfen ob dll vorhanden ist
 
Hallo,

für ein externes USB-Modul muss in mein Delphiprogramm eine DLL eingebunden werden. Dieses ist auch kein Problem und funktioniert. Dazu müssen allerdings die Treiber und dll mit einem Setup installiert werden. Für jeden Anwender wird das aber nicht benötigt.

Deshalb die Frage, gibt es eine Möglichkeit zu prüfen, ob die dll installiert ist? Zur Zeit werden die Funktionen per function xyz;stdcall; external('zyx.dll'); geladen.

Luckie 12. Mär 2009 09:45

Re: Prüfen ob dll vorhanden ist
 
Was hast du für ein Setup? Mit Inno-Setup könnte man in einem Script prüfen, ob die DLL und der Treiber vorhanden sind.

DeddyH 12. Mär 2009 09:48

Re: Prüfen ob dll vorhanden ist
 
Wenn man von statischem auf dynamisches Laden umstellt, könnte man einfach den Rückgabewert von LoadLibrary bzw. GetProcAddress prüfen.

Progman 12. Mär 2009 09:54

Re: Prüfen ob dll vorhanden ist
 
Reicht nicht ein einfaches "if FileExists(dllName) then ...."?

Luckie 12. Mär 2009 09:59

Re: Prüfen ob dll vorhanden ist
 
Wenn sie statisch eingebunden wird und sie nicht vorhanden ist, kann der Loader die Impoerte nicht auflösen und bricht das Laden mit einer Fehlermeldung ab. das geht nur, wenn du sie auch dynamisch lädst.

Aber bisher wissen wir ja noch gar nicht, ob bei der Installation das Vorhanden sein der DLL gebprüft werden soll oder zur Laufzeit.

BAMatze 12. Mär 2009 10:11

Re: Prüfen ob dll vorhanden ist
 
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

Luckie 12. Mär 2009 10:13

Re: Prüfen ob dll vorhanden ist
 
Du machst ja nichts anderes, als das was wir die ganze Zeit sagen. Du bindest sie dynamisch ein:
Delphi-Quellcode:
DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+ 'DLL\'+sDLLName));

BAMatze 12. Mär 2009 10:16

Re: Prüfen ob dll vorhanden ist
 
Ja hab das als Ergänzung mal zu euren Erklärungen reingestellt, weil mir ein Beispiel auch immer hilft und ich das auch gerade bei der Hand hatte.

DeddyH 12. Mär 2009 10:56

Re: Prüfen ob dll vorhanden ist
 
Zitat:

Zitat von Progman
Reicht nicht ein einfaches "if FileExists(dllName) then ...."?

Ich fürchte nein, da die DLL ja nicht zwingend in einem bestimmten Verzeichnis stehen muss, man müsste also ggf. den kompletten Suchpfad abgrasen. Abgesehen davon startet das Programm bei statischem Import und fehlender DLL ja erst gar nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz