![]() |
Funktion aus der Dll aufrufen?
Das Problem liegt darin, dass dll in Fortran mit Hilfe von Fortran-Compiler geschrieben wurde. Delphi findet schon Funtion in dieser Dll, ich kann die sogar aufrufen, aber ich bekomme total falschen Wert. Hier ist ein Teil von meiner Quellcode:
Delphi-Quellcode:
Statt 6 bekomme ich so ein Ergebnis: -2334563. Und ich weiß jetzt nicht genau, wo liegt der Fehler: entweder in Dll oder ich mache in meiner Code was falsch? Danke. 8)
function VPUNK(t2:integer) : integer; external 'quelle.dll'; // rufe diese funktion VPUNK auf.
implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var cPfad, c1 : string; a,t2: integer; begin t2 := 3; a := VPUNK(t2); // verwende sie c1:= inttostr(a); |
Re: Funktion aus der Dll ausrufen?
Hi egal,
verwende doch bitte die [delphi]-Tags ;-) ...:cat:... |
Re: Funktion aus der Dll ausrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Schreib mal den betreffenden Quellcodeteil komplett hin. Mit den Bruchstücken kann man nicht viel anfangen.
|
Re: Funktion aus der Dll aufrufen?
Vielleicht liegt es daran:
Delphi-Quellcode:
In der Regel werden DLL-Funktionen mit der Aufrufkonvention stdcall deklariert, sollte das auch nicht klappen kannst du es auch mal mit cdecl probieren.
function VPUNK(t2:integer) : integer; external 'quelle.dll'; stdcall;
|
Re: Funktion aus der Dll aufrufen?
Zitat:
Delphi-Quellcode:
Ist so besser?function VPUNK(t2:integer) : integer; external 'quelle.dll'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var cPfad, c1 : string; a,t2: integer; begin t2 := 3; a := VPUNK(t2); c1:= inttostr(a); |
Re: Funktion aus der Dll aufrufen?
Zitat:
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Das mit den unterschiedlichen Deklarationen kommt vermutlich daher, dass du stdcall sowohl oben als auch unten bei der procedur anschreiben musst, also so:
Delphi-Quellcode:
Denk ich mal (ist zwar doof beschreiben, aber ich denke man sieht, was gemeint ist ;-) )
function VPUNK(t2:integer) : integer; external 'quelle.dll'; stdcall;
. . . function VPUNK(t2:integer) : integer; external 'quelle.dll'; stdcall; // rufe diese funktion VPUNK auf. t2: integer; t2 := 3; a := VPUNK(t2); // verwende sie. Hab mich verguckt, ist natürlich murks, was ich da geschrieben hab. Du musst sowohl im Code der DLL ein stdcall; ranhängen als auch in der Unit, in der du sie verwendest. |
Re: Funktion aus der Dll aufrufen?
Und jetzt noch die Funktion in der DLL und wie du sie exportiert hast. Dann kann man dir eventuell weiterhelfen.
|
Re: Funktion aus der Dll aufrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Zitat:
Delphi-Quellcode:
integer function vpunk(t)
!DEC$ ATTRIBUTES DLLEXPORT :: vpunk integer t integer a,b a=2 b=3 vpunk = a*b+2-t end function vpunk |
Re: Funktion aus der Dll aufrufen?
So sollte es gehen:
Delphi-Quellcode:
function VPUNK(t2:integer) : integer; stdcall;
implementation {$R *.dfm} function VPUNK(t2:integer) : integer; external 'quelle.dll'; stdcall; // rufe diese |
Re: Funktion aus der Dll aufrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Dann probier einfach alle Direktiven durch:
register, cdecl, pascal und safecall. Mehr kann der der Delphi-Compiler auch nicht. |
Re: Funktion aus der Dll aufrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
In Delphi gibt es ja die MS-Calling-Convention __fastcall nicht, auch andere werden nicht unterstützt. Womöglich kompiliert FORTRAN deine DLL mit einer dieser nicht unterstützten und du merkst es nicht. Versuch doch mal, in FORTRAN die COnventions vorzugeben, dann brauchst du sie in Delphi nur noch abzuschreiben.
|
Re: Funktion aus der Dll aufrufen?
Moin!
Laut ![]() Und wegen der Zugriffsverletzung: Ich hatte auch mal ein paar Fortran DLL Funktionen zu implementieren und diese haben alle bei Parameter einen Zeiger auf diesen erwartet. Also probier es zusätzlich mal aus den Aufrufparameter als Var zu deklarieren. Dazu musst du dann wahrscheinlich eine lokale Variable deklarieren für den Aufruf aber damit klappte es dann bei der Fortran DLL. MfG Muetze1 |
Re: Funktion aus der Dll aufrufen?
Also, ich habe auch mal durch die Quicktime API und anderes mit cdecl zu tun gehabt. Das ist auf jeden Fall etwas kniffeliger als die anderen und produziert auch schon mal AVs. Eine gute Lösung habe ich bis jetzt noch nicht gefunden, das mit den VAR-Parametern könnte aber durchaus hinhauhen.
EDIT: Zitat:
|
Re: Funktion aus der Dll aufrufen?
Zitat:
|
Re: Funktion aus der Dll aufrufen?
Generell beides: Wenn Fortran in cdecl exportiert musst du in Delphi auch in cdecl importieren.
|
Re: Funktion aus der Dll aufrufen?
:-D :-D :-D :-D :-D Endlich!!!!!!!!!!
Tatsächlich musste man nur var beim Aufrufparameter schreiben, mit stdcall funktioniert auch. Allen vielen, vielen Dank!!!!!!!! :hello: |
Re: Funktion aus der Dll aufrufen?
Zitat:
@egal: Du kannst auch CONST nehmen oder es als Pointer auf den entsprechenden Typen deklarieren. Ist alles im Tut beschrieben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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