Einzelnen Beitrag anzeigen

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