![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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