Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
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:
sollte identisch sein mit
TParList = record
Par1 : double; Par2 : double; TempLow : double; TempHi : double; PE : bool; end;
Code:
Und
typedef struct ParList
{ double Par1; double Par2; double TempLow; double TempHi; bool PE; } TParList;
Delphi-Quellcode:
mit
function _Multi(var Values : TParList) : double; external '2008.dll';
Code:
In der function selbst wird nur ein Eingabewert als Ergebnis durchgereicht.
extern "C" __declspec(dllimport) double Multi(TParList *Values);
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 |
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
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.
|
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Oder noch besser:
Delphi-Quellcode:
und Aufruf mit
type PParList = ^TParList;
function _Multi(Values : PParList) : double; external '2008.dll';
Delphi-Quellcode:
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.
var P: TParList;
begin _Multi (@P) end; |
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
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 |
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Auch nicht mit der Delphi-Pointer-Variante?
|
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Zitat:
Die Funktion in der dll ist auch nicht besonders anspruchsvoll.
Code:
Und der Aufruf aus C++ liefert den übergebenen Wert.
double Multi(TParList *Values)
{ double result; result = Values->TempLow; return result; }
Delphi-Quellcode:
Mit der Pointer-Variante kommt ein identisches Ergebnis
procedure TForm1.Button1Click(Sender: TObject);
var Test : TParList; result : double; begin Test.TempLow := -333; result := _Multi(Test); ShowMessage(FloatToStr(result)); end; Grüße, Messie |
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
dann müsste es an der struktur oder der Reihenfolge der Felder liegen. Vereinfache dein Beispiel erstmal auf einen Record mit nur einem double.
|
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Zitat:
:wall: |
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
dann versuch mal cdecl, hatte ich bisher leider übersehen:
Delphi-Quellcode:
function _Multi(Values : PParList) : double; cdecl; external '2008.dll';
|
Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 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