AGB  ·  Datenschutz  ·  Impressum  







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

DLL dynamisch laden

Ein Thema von BAMatze · begonnen am 13. Feb 2009 · letzter Beitrag vom 19. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

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

DLL dynamisch laden

  Alt 13. Feb 2009, 13:20
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:
const ExtLib_Verschiebetische = 'MMC.DLL';

function MMC_COM_open(portnumber,baudrate:integer):integer;
            stdcall external ExtLib_Verschiebetische;
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:

dynamisches Laden einer URL

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 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:
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.
Danke
BAMatze
  Mit Zitat antworten Zitat
worker
(Gast)

n/a Beiträge
 
#2

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:23
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;
  Mit Zitat antworten Zitat
BAMatze

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

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:29
Zitat von worker:
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;
hmm kannst du mal die Bibliotheken noch aufführen, die du verwendet hast, weil einige Funktionen wie LoadedImage, MapandLoad u.s.w nicht erkannt werden ohne weiteres.
  Mit Zitat antworten Zitat
worker
(Gast)

n/a Beiträge
 
#4

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:31
Sorry

Delphi-Quellcode:
   Windows,
   Messages,
   SysUtils,
   Variants,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs,
   ImageHlp,
   StdCtrls;
  Mit Zitat antworten Zitat
BAMatze

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

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:45
Wo kommt denn der Fehler (ist extractFilePath evtl. ohne abschließendes "\" ?)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
BAMatze

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

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:51
Zitat von sirius:
Wo kommt denn der Fehler (ist extractFilePath evtl. ohne abschließendes "\" ?)
Hallo @sirius,

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.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:56
So rufe ich meine AboutBox-Form auf, die in einer DLL ist :
Delphi-Quellcode:
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;
Das ganze sollte auch auf eine normale Funktion oder Procedure Deiner DLL anwendbar sein.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 13:57
Was kommen denn für Fehlermeldungen?

Außerdem hast du Finally, wo du anscheinend Except haben willst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: DLL dynamisch laden

  Alt 13. Feb 2009, 14:01
Zitat von sirius:
Außerdem hast du Finally, wo du anscheinend Except haben willst.
Auserdem machst du später Deinen Test auf nil. Ich würde sicherheitshalber den Zeiger wirklich noch vor GetProcAdress auf nil setzten bzw im EXCEPT-Fall spätestens.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:04 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