![]() |
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. |
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.
|
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.
|
Re: Prüfen ob dll vorhanden ist
Reicht nicht ein einfaches "if FileExists(dllName) then ...."?
|
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. |
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:
Und so überprüfe ich sie (habe mir für jedes Gerät eine eigene Klasse geschrieben (hier ein Auszug davon)
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;
Delphi-Quellcode:
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.
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; Hoffe das hilft dir etwas. BAMatze |
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));
|
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.
|
Re: Prüfen ob dll vorhanden ist
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz