AGB  ·  Datenschutz  ·  Impressum  







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

Anwendung stoppt bei DLL aufruf

Ein Thema von Masterof · begonnen am 2. Feb 2005 · letzter Beitrag vom 3. Feb 2005
Antwort Antwort
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#1

Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 14:34
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
stefan2005

Registriert seit: 30. Sep 2003
Ort: Puchheim
250 Beiträge
 
Delphi 6 Personal
 
#2

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 14:38
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
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 14:48
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 15:18
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
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 18:54
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 19:01
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Anwendung stoppt bei DLL aufruf

  Alt 2. Feb 2005, 21:15
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: Anwendung stoppt bei DLL aufruf

  Alt 3. Feb 2005, 07:22
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?
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Anwendung stoppt bei DLL aufruf

  Alt 3. Feb 2005, 09:59
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:55 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