AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

Ein Thema von messie · begonnen am 8. Feb 2010 · letzter Beitrag vom 10. Mär 2010
Antwort Antwort
Seite 2 von 3     12 3      
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 10:56
So, ich bin da mal wieder dran...

Ich habe jetzt einen struct in der dll erstellt und den als Parameter der function _Multi übergeben. Der Aufruf aus dem Builder klappt, beim Aufruf aus Delphi klemmt es.

Delphi-Quellcode:
TParList = record
    Par1 : double;
    Par2 : double;
    TempLow : double;
    TempHi : double;
    PE : bool;
  end;
sollte identisch sein mit
Code:
typedef struct ParList
{
   double Par1;
   double Par2;
   double TempLow;
   double TempHi;
   bool PE;
} TParList;
Und function _Multi(var Values : TParList) : double; external '2008.dll'; mit
Code:
extern "C" __declspec(dllimport) double Multi(TParList *Values);
In der function selbst wird nur ein Eingabewert als Ergebnis durchgereicht.
Der Aufruf im Delphi-Programm liefert aber Müll zurück. Ich habe die TParList in Delphi lokal definiert und übergebe sie dann als var-Parameter, während ich sie in C++ mit new erzeuge. Kann das ein Problem sein? Ich dachte, beim record wird der Speicher automatisch zugewiesen.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 11:08
Ja, der Speicher kommt doch schon von Delphi, also im C-Teil einfach mit dem übergebenen Pointer arbeiten und auf keinen Fall mit New anlegen, dann müsste es gehen.
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 11:16
Oder noch besser:

Delphi-Quellcode:
type PParList = ^TParList;
function _Multi(Values : PParList) : double; external '2008.dll';
und Aufruf mit
Delphi-Quellcode:
var P: TParList;
begin
  _Multi (@P)
end;
Wenn du dann noch mit $T+ die Typprüfung für den @-Operator einschaltest, hast dann auch Sicherheit, das nur passende Parameter übergeben werden können.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 11:33
Hmmm, das Ergebnis bleibt gleich - keine sinnvolle Antwort.

New habe ich auch nur in meinem C++ Testprojekt verwendet, nicht in der dll.

Kann man sich denn da mit dem Debugger reinhängen? Alle Projekte sind als debug-Version erstellt.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 11:44
Auch nicht mit der Delphi-Pointer-Variante?
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#16

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 11:59
Zitat von Jaynder:
Auch nicht mit der Delphi-Pointer-Variante?
Nee, leider nicht. Der Aufruf scheint zu funktionieren, ich bekomme aber einen Zufallswert nahe 0 zurück.

Die Funktion in der dll ist auch nicht besonders anspruchsvoll.
Code:
double Multi(TParList *Values)
{
   double result;
   result = Values->TempLow;
   return result;
}
Und der Aufruf aus C++ liefert den übergebenen Wert.


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Test : TParList;
  result : double;
begin
  Test.TempLow := -333;
  result := _Multi(Test);
  ShowMessage(FloatToStr(result));
end;
Mit der Pointer-Variante kommt ein identisches Ergebnis

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 12:13
dann müsste es an der struktur oder der Reihenfolge der Felder liegen. Vereinfache dein Beispiel erstmal auf einen Record mit nur einem double.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#18

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 13:02
Zitat von Jaynder:
dann müsste es an der struktur oder der Reihenfolge der Felder liegen. Vereinfache dein Beispiel erstmal auf einen Record mit nur einem double.
Auch das funzt nicht. Direkt als double-Parameter ohne den record geht, mit der record-Struktur nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 13:12
dann versuch mal cdecl, hatte ich bisher leider übersehen:

function _Multi(Values : PParList) : double; cdecl; external '2008.dll';
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#20

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 19. Feb 2010, 14:08
Jo, nu' geht es. Danke!

Auf was alles hat denn das cdecl einen Einfluss? Also auf double-Parameter ja nicht. Aber dann kommt alles mit Feldern in Verdacht: records, arrays, Objekte?

Ich hab' mal einen AnsiString probiert, da kommt ein Haufen Linkermeldungen. Da wird dann wohl eher PChar in Frage kommen.

Grüße, Messie
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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