![]() |
DLL dynamisch laden
Hallo an alle
weiß das Thema wurde hier schon öfter mal behandelt, aber irgendwie hab ich noch nichts gefunden, was meine Fragen zum dynamischen Laden einer DLL beantwortet. Also folgende Situation: Ich habe mehrere DLL´s die ich bisher direkt lade. Hier ein kurzer Ausschnitt, damit ihr wißt, wie ich es mache:
Delphi-Quellcode:
Also nichts weiter aufwendiges und funktioniert wunderbar. Allerdings möchte ich jetzt eine verherige überprüfung durchführen, ob sich die Datei in dem Verzeichnis befindet. Hier fangen jetzt meine Probleme an. Habe versucht dies anhand folgendem Threat zu programmieren:
const ExtLib_Verschiebetische = 'MMC.DLL';
function MMC_COM_open(portnumber,baudrate:integer):integer; stdcall external ExtLib_Verschiebetische; ![]() Da ich aber den genauen Namen nicht kenne, der in der Mitgelieferten DLL verwendet wird, bekomme ich immer eine Fehlermeldung beim Laden einer Funktion aus der DLL. Hier mal das, was ich bisher programmiert habe. Vieleicht ist nur ein Fehler in meinem Code, wenn ja bin ich schon zu betriebsblind :-D um ihn zu finden. Vieleicht hat jemand auch eine andere Idee, wie ich die Überprüfung durchführen kann, ohne die DLL dynamisch zu laden.
Delphi-Quellcode:
Danke
unit VT_Funktionen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls; const maxComport = 100; Bautrate = 9600; type TV_Tische = class private Tischbmp: TBitmap; procedure Funktionenladen; public DLL_Handle: THandle; bBewegung, bkalibriert: boolean; iaktuelleTischposition, iZielTischposition, iComport: integer; bAngeschlossen: boolean; constructor create; reintroduce; destructor destroy; override; function VT_DLL_suche: boolean; function VTischeverbinden: boolean; end; Type TVerbindenVT = function (portnumber,baudrate:integer):integer; stdcall; //function MMC_COM_open(portnumber,baudrate:integer):integer; {function MMC_COM_open(portnumber,baudrate:integer):integer; stdcall; function MMC_COM_close:integer; stdcall;} //function initialisieren_VT: integer; Var VerbindenVT: TVerbindenVT; implementation constructor TV_Tische.create; begin inherited create; bBewegung := false; bkalibriert := false; bAngeschlossen := false; iComport := 0; end; procedure TV_Tische.Funktionenladen; begin try @VerbindenVT := GetProcAddress(DLL_Handle, 'MMC_COM_open') finally showmessage('Funktion konnte nicht geladen werden'); end; end; function TV_Tische.VTischeverbinden: boolean; begin try if @VerbindenVT <> nil then while (VerbindenVT(iComport, Bautrate) <> 0) and (iComPort < maxComPort) do begin iComport + 1; end finally Showmessage('Die Verbindungsfunktion konnte nicht geladen werden'); end; end; function TV_Tische.VT_DLL_suche: boolean; begin try DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'MMC.DLL')); if DLL_Handle <> 0 then begin result := true; Funktionenladen; end else result := false except result := false; end; end; destructor TV_Tische.destroy; begin //FreeLibary(DLL_Handle); inherited destroy; end; end. BAMatze |
Re: DLL dynamisch laden
Mit folgendem Code kannst Du die von der DLL exportierten Funktionen ausgeben:
Delphi-Quellcode:
procedure ListDLLExports(const FileName: string; List: TStrings);
type TDWordArray = array [0..$FFFFF] of DWORD; var imageinfo: LoadedImage; pExportDirectory: PImageExportDirectory; dirsize: Cardinal; pDummy: PImageSectionHeader; i: Cardinal; pNameRVAs: ^TDWordArray; Name: string; begin List.Clear; if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then begin try pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress, False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize); if (pExportDirectory <> nil) then begin pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress, DWORD(pExportDirectory^.AddressOfNames), pDummy); for i := 0 to pExportDirectory^.NumberOfNames - 1 do begin Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress, pNameRVAs^[i], pDummy)); List.Add(Name); end; end; finally UnMapAndLoad(@imageinfo); end; end; end; |
Re: DLL dynamisch laden
Zitat:
|
Re: DLL dynamisch laden
Sorry
Delphi-Quellcode:
Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImageHlp, StdCtrls; |
Re: DLL dynamisch laden
Danke @worker, funzt gut.
die DLL enthält wirklich die Funktion, so wie ich sie über mein Programm aufrufen möchte. Warum kann diese aber nicht geladen werden? mache ich eventuell etwas grundlegendes falsch? |
Re: DLL dynamisch laden
Wo kommt denn der Fehler (ist extractFilePath evtl. ohne abschließendes "\" ?)
|
Re: DLL dynamisch laden
Zitat:
also das Handle wird auf jeden Fall gefunden, so wie es aussiegt, da der Aufruf der Procedure Funktionenladen ausgeführt wird. Habe dies trotzdem mal getestet und mit einem zusätzlichen "\" kommt es direkt beim Aufruf der Procedure Funktionenladen zu einer Exception. |
Re: DLL dynamisch laden
So rufe ich meine AboutBox-Form auf, die in einer DLL ist :
Delphi-Quellcode:
Das ganze sollte auch auf eine normale Funktion oder Procedure Deiner DLL anwendbar sein.
type
TFormDLLBox = procedure(appHandle: THandle); stdcall; procedure TMainForm.Act_AboutBoxExecute(Sender: TObject); var hDLL: THandle; AboutBoxWindow: TFormDLLBox; begin hDLL := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + HLPBOXES)); if hDLL <> 0 then begin try AboutBoxWindow := GetProcAddress(hDLL, 'AboutBox'); AboutBoxWindow(Application.Handle); finally FreeLibrary(hDLL); end; end else Application.MessageBox(PChar('Die Datei "' + HLPBOXES + '" konnte nicht gefunden werden.' + #13#10+ 'Bitte überprüfen Sie Ihr Programmverzeichnis'), 'Hinweis', MB_OK); end; |
Re: DLL dynamisch laden
Was kommen denn für Fehlermeldungen?
Außerdem hast du Finally, wo du anscheinend Except haben willst. |
Re: DLL dynamisch laden
Zitat:
Gruß, Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 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