Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion aus der Dll aufrufen? (https://www.delphipraxis.net/29754-funktion-aus-der-dll-aufrufen.html)

egal 14. Sep 2004 12:29

Re: Funktion aus der Dll aufrufen?
 
Zitat:

Zitat von Luckie
Und jetzt noch die Funktion in der DLL und wie du sie exportiert hast. Dann kann man dir eventuell weiterhelfen.

die dll wurde mit Hilfe von Fortran-Compiler geschrieben, da muss man nur entsprechnede Befehle in command-line schreiben und er erstellt selber die Dll. Die Funktion wurde in Fortran geschrieben, hier ist die Quellcode:
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

scp 14. Sep 2004 12:30

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

egal 14. Sep 2004 12:36

Re: Funktion aus der Dll aufrufen?
 
Zitat:

Zitat von scp
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

bekomme Zugriffsverletzungmeldung und Ergebnis ist auch falsch

egal 14. Sep 2004 12:39

Re: Funktion aus der Dll aufrufen?
 
Zitat:

Zitat von Ultimator
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.[/color]

Ich bin gar nicht sicher, dass es in Fortran auch stdcall gibt.

Dax 14. Sep 2004 13:00

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.

egal 14. Sep 2004 13:22

Re: Funktion aus der Dll aufrufen?
 
Zitat:

Zitat von Dax
Dann probier einfach alle Direktiven durch:
register, cdecl, pascal und safecall. Mehr kann der der Delphi-Compiler auch nicht.

mit register bekomme ich wie früher den alten falschen Ergebnis, bei anderen dieselbe Fehlermeldung.

Dax 14. Sep 2004 13:25

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.

Muetze1 14. Sep 2004 13:57

Re: Funktion aus der Dll aufrufen?
 
Moin!

Laut dieser Website nutzt Fortran die cdecl Calling Convention. Also ist eigentlich nur dies das richtige.

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

scp 14. Sep 2004 14:11

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:

Zitat von Assarbad's Tutorial
Bei allen Konventionen außer cdecl entfernt die Funktion die Parameter selbst vom Stack (in Delphi geschieht dies durch das Stackframe-Handling automatisch). Bei cdecl ist der Aufrufer dafür zuständig.

Heisst das man muss da extra ein paar Zeilen Code für schreiben, wenn ja was?

egal 14. Sep 2004 14:45

Re: Funktion aus der Dll aufrufen?
 
Zitat:

Zitat von Muetze1
Moin!

Laut dieser Website nutzt Fortran die cdecl Calling Convention. Also ist eigentlich nur dies das richtige.

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

wo genau: in Fortran oder Delphi? Für Code wäre ich besonders dankbar! :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
Seite 2 von 3     12 3      

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