Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL Programmierung (https://www.delphipraxis.net/93626-dll-programmierung.html)

DIET3RIX 8. Jun 2007 13:39


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:
library TangensDLL;

uses
  SysUtils,
  Classes;

function Tangens(Wert:double): Double; stdcall;
begin
  Result := sin(Wert)/cos(Wert);
end;

exports
  Tangens;

begin
end.
So, danach kommt statisches Importieren.
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

SirThornberry 8. Jun 2007 13:42

Re: DLL Programmierung
 
schau dir mal in der hilfe sin und cos an. Da steht etwas von Bogenmaß :wink:

CCRDude 8. Jun 2007 13:52

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.

DIET3RIX 8. Jun 2007 14:00

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.

messie 8. Jun 2007 14:06

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

DIET3RIX 8. Jun 2007 14:22

Re: DLL Programmierung
 
Sorry, aber das verstehe ich nicht.
Zitat:

Zitat von messie
Bogenmaß heißt, daß Du statt Grad Bogenmaß eingeben musst (2*Pi = 360°).

Wie soll ich die 45° eingeben? Ist Bogenmaß != Grad bei der Eingabe?


Zitat:

Zitat von messie
Also Deine Eingabe nach Dreisatz durch 360 teilen und mit 2*Pi multiplizieren. Dann kommt auch 1 beim Tangens raus.

Nach Dreisatz? Nach welchen?

Sorry, aber wenn man nicht weiß wie's gemeint ist, dann ist es echt schwer nachvollziehen.

Thorben_Ko 8. Jun 2007 14:26

Re: DLL Programmierung
 
http://de.wikipedia.org/wiki/Bogenma%C3%9F

sollte eig alles erklären ;)

SirThornberry 8. Jun 2007 14:30

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))

CCRDude 8. Jun 2007 14:33

Re: DLL Programmierung
 
Zitat:

Zitat von DIET3RIX
und wie mache ich das?
Also das Beispiel hab ich aus dem Buch übernommen.

So:
Delphi-Quellcode:
function Tangens(Wert: double): double; external 'TangensDLL.dll'; stdcall;
function Tangens(Wert: double): double; stdcall; external 'TangensDLL.dll';
Weiß gerade nicht auswendig, ob es egal ist wo das stdcall steht ;)
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;

DIET3RIX 8. Jun 2007 14:41

Re: DLL Programmierung
 
Oke, vielen Dank an euch.

DegToRad, das hab ich gebraucht ;)

CCRDude
Delphi-Quellcode:
function Tangens(Wert: double): double; stdcall; external 'TangensDLL.dll';
so muss das aussehen. Setzt man stdcall am ende, so kommt da 'ne Fehlermeldung:
Zitat:

[Fehler] TangensEXE.pas(27): Deklaration von 'Tangens' unterscheidet sich von vorheriger Deklaration
Vielen Dank an alle die mir versucht haben zu helfen.

sirius 8. Jun 2007 14:58

Re: DLL Programmierung
 
Zitat:

Zitat von DIET3RIX
Delphi-Quellcode:
function Tangens(Wert: double): double; stdcall; external 'TangensDLL.dll';
so muss das aussehen. Setzt man stdcall am ende, so kommt da 'ne Fehlermeldung:
Zitat:

[Fehler] TangensEXE.pas(27): Deklaration von 'Tangens' unterscheidet sich von vorheriger Deklaration

Du kannst auch bei beiden Deklarationen (in der Library ud in deinem Programm) die Konvention stdcall weglassen.
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:

SirThornberry 8. Jun 2007 15:01

Re: DLL Programmierung
 
Zitat:

Zitat von sirius
PS: Du rechnest mit Winkelfunktionen und hast noch nie etwas vom Bogenmaß gehört? :gruebel:

Finde ich nicht ungewöhnlich. Ich habe auch nie etwas vom Bogenmaß gehört bis ich in Delphi das gleiche Problem hatte.

DIET3RIX 8. Jun 2007 15:10

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 09:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz