![]() |
DLL Programmierung
Hey Leute,
ich hab jetzt ein bissle Zeit und hab beschlossen mich ma wieder mit Delphi zu beschäftigen. Buch aufgeschlagen -> Dynamic Link Libraries, kligt ganz gut. Eine DLL geschrieben und erzeugt (TangensDLL.dll):
Delphi-Quellcode:
So, danach kommt statisches Importieren.
library TangensDLL;
uses SysUtils, Classes; function Tangens(Wert:double): Double; stdcall; begin Result := sin(Wert)/cos(Wert); end; exports Tangens; begin end.
Delphi-Quellcode:
unit TangensEXE;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function Tangens(Wert: double): double; external 'TangensDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); var vResult: double; begin try vResult := Tangens(45); except ShowMessage('Die Funktion Tangens existiert nicht.'); end; Edit1.Text := FloatToStr(vResult); end; end. Wenn ich jetzt den Button drücke, dann bekomme ich "1,61977519054386" raus. Aber Tangens von 45° ist doch 1. Im Buch steht, dass "function Tangens(Wert: double): double; external 'TangensDLL.dll';" im interface-Abschnitt stehen muss, aber wo endet interface und wenn ich die Zeile direkt unter interface tippe, dann bekomme ich immer jede Menge Fehlermeldungen. THX voraus |
Re: DLL Programmierung
schau dir mal in der hilfe sin und cos an. Da steht etwas von Bogenmaß :wink:
|
Re: DLL Programmierung
Wenn Du als stdcall exportierst, musst Du es auch als stdcall importieren.
Sonst kommen schonmal "Fantasywerte" zustande, weil die Aufrufkonventionen sich in der Übergabe von Parametern unterscheiden. |
Re: DLL Programmierung
und wie mache ich das?
Also das Beispiel hab ich aus dem Buch übernommen. @ SirThornberry ich hab da nicht wirklich was gefunden. Da steht nur das es im Bogenmaß ausgegeben wird, aber mit dem Bogenmaß kann ich nichts anfangen. |
Re: DLL Programmierung
Bogenmaß heißt, daß Du statt Grad Bogenmaß eingeben musst (2*Pi = 360°). Also Deine Eingabe nach Dreisatz durch 360 teilen und mit 2*Pi multiplizieren. Dann kommt auch 1 beim Tangens raus.
Grüße, Messie |
Re: DLL Programmierung
Sorry, aber das verstehe ich nicht.
Zitat:
Zitat:
Sorry, aber wenn man nicht weiß wie's gemeint ist, dann ist es echt schwer nachvollziehen. |
Re: DLL Programmierung
|
Re: DLL Programmierung
oder einfach die funktionen DegToRad und RadToDeg nutzen. Wenn die Funktion also Bogenmaß haben will und du das ganze in Grad angeben willst gehts so: FunktionWelcheBogenmaßErwartet(DegToRad(45))
|
Re: DLL Programmierung
Zitat:
Delphi-Quellcode:
Weiß gerade nicht auswendig, ob es egal ist wo das stdcall steht ;)
function Tangens(Wert: double): double; external 'TangensDLL.dll'; stdcall;
function Tangens(Wert: double): double; stdcall; external 'TangensDLL.dll'; Aufrufkonvention muss halt identisch sein mit dem, was Du vorher geschrieben hattest in der DLL, und dort wird ja auch stdcall gesetzt:
Delphi-Quellcode:
function Tangens(Wert:double): Double; stdcall;
|
Re: DLL Programmierung
Oke, vielen Dank an euch.
DegToRad, das hab ich gebraucht ;) CCRDude
Delphi-Quellcode:
so muss das aussehen. Setzt man stdcall am ende, so kommt da 'ne Fehlermeldung:
function Tangens(Wert: double): double; stdcall; external 'TangensDLL.dll';
Zitat:
|
Re: DLL Programmierung
Zitat:
Dadurch wird automatisch die Standardkonvention (in Delphi) "register" genommen, wie bei den meisten anderen Funktionen in Delphi auch. Dadurch wird nur festgelegt wo und in welcher Reihenfolge die Parameter (in deinem Fall die Variable "Wert") an die Funktion übergeben wird. btw: In deinem Fall macht register und stdcall sogar dasselbe. PS: Du rechnest mit Winkelfunktionen und hast noch nie etwas vom Bogenmaß gehört? :gruebel: |
Re: DLL Programmierung
Zitat:
|
Re: DLL Programmierung
Das Beispiel hab ich aus dem Buch ;) ich war der Meinung das ich das hingeschrieben hab, seh' aber dass das doch nicht der Fall ist.
Ich hab schon was von Bogenmaß gehört, nur wusste nicht wie das bei Delphi gehandhabt ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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