![]() |
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:
Wenn ich es ausführe beibt der Compiler bei begin vor dem Application.Initialize stehen.
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'; Was kann der Fehler sein. MfG Master |
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 |
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:
MfG Master
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. |
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 |
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:
MfG Master
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. |
Re: Anwendung stoppt bei DLL aufruf
Zitat:
|
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 |
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:
Hast du die Funktion berechnen auch in der DLL exportiert?
if pBerechnung = Nil then
begin showmessage('Fehler'); exit; end; |
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