AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob dll vorhanden ist

Ein Thema von steewan · begonnen am 12. Mär 2009 · letzter Beitrag vom 12. Mär 2009
Antwort Antwort
steewan

Registriert seit: 27. Nov 2003
20 Beiträge
 
#1

Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 09:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 09:45
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 09:48
Wenn man von statischem auf dynamisches Laden umstellt, könnte man einfach den Rückgabewert von LoadLibrary bzw. GetProcAddress prüfen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 09:54
Reicht nicht ein einfaches "if FileExists(dllName) then ...."?
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 09:59
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 10:13
Du machst ja nichts anderes, als das was wir die ganze Zeit sagen. Du bindest sie dynamisch ein:
DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+ 'DLL\'+sDLLName));
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
BAMatze

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

Re: Prüfen ob dll vorhanden ist

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

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Prüfen ob dll vorhanden ist

  Alt 12. Mär 2009, 10:56
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:51 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