Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anwendung stoppt bei DLL aufruf (https://www.delphipraxis.net/39426-anwendung-stoppt-bei-dll-aufruf.html)

Masterof 2. Feb 2005 14:34


Anwendung stoppt bei DLL aufruf
 
Hallo!

Ich habe eine Anwendung die stecken bleibet wenn ich die eine selber geschriebene DLL dynamisch laden

Quelltext:
Delphi-Quellcode:
Type
 TBerechnung= Function(zahl1, zahl2, zahl3: double): double;
var
  frmmain: Tfrmmain;
  pBerechnung : TBerechnung;

implementation

{$R *.dfm}
function Berechnung(zahl1, zahl2, zahl3: double): double; external 'C:\DLL\Formel.dll';
Wenn ich es ausführe beibt der Compiler bei begin vor dem Application.Initialize stehen.
Was kann der Fehler sein.

MfG Master

stefan2005 2. Feb 2005 14:38

Re: Anwendung stoppt bei DLL aufruf
 
hi,
kommt keine Fehlermeldung ?
vielleicht könntest du den ganzen (oder mehr relevanten) Code posten.

übrigens musst du externe Funktionen im Programm und in der DLL als "stdcall" definieren, damit die Funktionen zueinander kompatibel sind !
also z.B. "function Berechnung(...); stdcall;" !

cu,
stefan2005

Masterof 2. Feb 2005 14:48

Re: Anwendung stoppt bei DLL aufruf
 
Nein, leider kommt keine Fehlermeldung.

Das ist eigentlich der relevate Code, da weiter unten die Funktion nur noch aufgerufen wird. Bis da hin komme ich leider nicht.
Wen ich mit Strg + F9 compiliere, dann macht er es auch villständig, ausführen lässt es sich dann wiederum nicht.

Hier ist der vollständige code.

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, reinit, ExtCtrls;

type
  Tfrmmain = class(TForm)
    Label1: TLabel;
    edtext: TEdit;
    edtextafter: TEdit;
    btdll: TButton;
    btend: TButton;
    auswertungsm: TMemo;
    Label2: TLabel;
    Label3: TLabel;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure btendClick(Sender: TObject);
    procedure btdllClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    //DLL nach gebrach aus Speicher entfernen
    hDLL : THandle;
  public
    { Public-Deklarationen }
  end;
type
  //Prozedurtypen
  TFmtStringUpCase = function(Text: PChar):PChar;
var
  frmmain: Tfrmmain;
  //Prozedurvariable
  pFmtStringUpCase : TfmtStringUpcase;
implementation

{$R *.dfm}
//Aufruf der Funktion in der DLL
function FmtStringUpCase(text:PChar): PChar; external 'g:\FmtStr32.dll';

procedure Tfrmmain.btendClick(Sender: TObject);
begin
 close;
end;

procedure Tfrmmain.btdllClick(Sender: TObject);
begin
//Protokollanzeige löschen
  auswertungsm.Lines.Clear;

  //DLL dynamisch laden
  hDLL:= LoadLibrary ('C:\WINDOWS\system32\FmtStr32.dll');
  if hDLL <> 0 then
   begin
    pFmtStringUpcase:= GetProcAddress(hDLL, 'FmtStringUpcase');
    auswertungsm.Lines.add('DLL erfolgreich geladen');
   end
   else
    begin
     Showmessage('Laden der DLL FmtStr32.dll fehlfeschlagen');
     exit;
    end;
    //Funktion aus der DLL aufrufen
   edtextafter.Text:= FmtStringUpCase(Pchar(edtext.Text));
   auswertungsm.Lines.add('Funktion in der DLL erfolgreich ausgeführt');

   //DLL wieder entladen und Ressoucen wieder freigeben
   if hDLL <> 0 then
    begin
     FreeLibrary(hDLL);
     pFmtStringUpCase := NIL;
     auswertungsm.Lines.add('Bibiliothek erfolgreich freigegeben');
    end;
end;

procedure Tfrmmain.FormCreate(Sender: TObject);
begin
 statusbar1.Panels[0].Text:= 'Michael Hertel © 2004';
end;

procedure Tfrmmain.Timer1Timer(Sender: TObject);
begin
 statusbar1.Panels[1].Text:= Timetostr(time);
end;

end.
MfG Master

Boombuler 2. Feb 2005 15:18

Re: Anwendung stoppt bei DLL aufruf
 
Kurze Frage am Rande: Hat das ne besondere Bewandnis, dass du die Funktion einmal Statisch und einmal dynamisch aus der DLL einbindest? bzW warum benutzt du die Dynamisch eingebundene version nicht?

Greetz
Boombuler

Masterof 2. Feb 2005 18:54

Re: Anwendung stoppt bei DLL aufruf
 
Hallo!!

Das mit dem laden habe ich gefunden. Jetzt bekomme ich noch eine Zugriffsverletztung bei der Adresse 00000000
Hier ist der Code.
Delphi-Quellcode:
init main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls, Buttons, reinit;

type
  Tfrmmain = class(TForm)
    Label1: TLabel;
    edzahl1: TEdit;
    edzahl2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    edzahl3: TEdit;
    Label4: TLabel;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    mDLLcontrol: TMemo;
    Label5: TLabel;
    mloesungen: TMemo;
    Label6: TLabel;
    bitend: TBitBtn;
    btcall: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure btcallClick(Sender: TObject);
    procedure bitendClick(Sender: TObject);
  private
    { Private-Deklarationen }
    //Steuerungsvariable für DLL
    hDLL: THandle;
  public
    { Public-Deklarationen }
  end;
type
 TBerechnung = Function(zahl1, zahl2, zahl3: double): double; stdcall;
var
  frmmain: Tfrmmain;
  pBerechnung : TBerechnung;

implementation

{$R *.dfm}
procedure Tfrmmain.Timer1Timer(Sender: TObject);
begin
 statusbar1.Panels[1].Text:= timetostr(time);
end;

procedure Tfrmmain.btcallClick(Sender: TObject);
var wert1, wert2, wert3: double;
    error1, error2, error3: integer;
begin
 val(edzahl1.Text, wert1, error1);
 val(edzahl2.Text, wert2, error2);
 val(edzahl3.Text, wert3, error3);
 if (error1 = 0) and (error2 = 0) and (error3= 0) then
 begin
  //DLL dynamisch laden
    hDLL:= LoadLibrary ('C:\DLL\Formel.dll');
  if hDLL <> 0 then
   begin
    pBerechnung:= GetProcAddress(hDLL, 'berechnen');
    statusbar1.Panels[0].Text:= 'DLL erfolgreich geladen';
   end
   else
    begin
     Showmessage('Laden der DLL Formel.dll fehlfeschlagen');
     exit;
    end;
    //Funktion aus der DLL aufrufen
   pberechnung(wert1, wert2, wert3);
   statusbar1.Panels [0].Text:= 'Funktion in der DLL erfolgreich ausgeführt';

   //DLL wieder entladen und Ressoucen wieder freigeben
   if hDLL <> 0 then
    begin
     FreeLibrary(hDLL);
     pberechnung := NIL;
     statusbar1.Panels[0].Text := 'Bibiliothek erfolgreich freigegeben';

    end;
   end;
   end;

procedure Tfrmmain.bitendClick(Sender: TObject);
begin
close;
end;

end.
MfG Master

SirThornberry 2. Feb 2005 19:01

Re: Anwendung stoppt bei DLL aufruf
 
Zitat:

Zitat von stefan2005
hi,
übrigens musst du externe Funktionen im Programm und in der DLL als "stdcall" definieren, damit die Funktionen zueinander kompatibel sind !

Das ist definitiv falsch. Es muss nur im Programm und in der DLL die gleiche Aufrufkonvention verwendet werden. Die Standard Aufrufkovention ist "register". Wird keine andere angegeben wird eben diese Verwendet. Wird also im Hauptprogramm und in der DLL nix angegeben verwenden beide die Aufrufconvention "register". Stdcall sollte man nehmen wenn die DLL auch für andere Programmierer mit anderer Programmiersprache verwendbar sein soll, da wie der name schon sagt dies die Standard aufruf methode ist.

Masterof 2. Feb 2005 21:15

Re: Anwendung stoppt bei DLL aufruf
 
Hallo!!

Ja das mit dem Register habe ich korrigiert, aber der Fehler mit dem Aufruf ist trotzdem nicht weg. Kann mir jemand sagen wo der Fehler im Quelltext ist. Ich glaube die DLL wird nicht geladen. Die Pfadsangabe ist auf jeden Fall richtig.

MfG Master

jim_raynor 3. Feb 2005 07:22

Re: Anwendung stoppt bei DLL aufruf
 
Ich vermute ganz einfach, dass pBerechnung:= GetProcAddress(hDLL, 'berechnen'); fehlschlägt und pBerechnung nil ist.

Also mach auf jeden Fall nach dem GetProcAddress ne Prüfung von

Delphi-Quellcode:
if pBerechnung = Nil then
begin
  showmessage('Fehler');
  exit;
end;
Hast du die Funktion berechnen auch in der DLL exportiert?

Masterof 3. Feb 2005 09:59

Re: Anwendung stoppt bei DLL aufruf
 
HAllo!!!

also, ich habe den Fehler gefuden. Im Programm selbt war nichts weiter falsch.
Der Fehler ist in der Dll selbst gewesen. Ich hatte den Rückgabewert nicht festgelegt.

Danke nochmal.

Master


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 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