![]() |
C++DLL in Delphi mit Wertrückgabe ?
Hallo,
ich habe in CBuilder5 ein DLL wie folgt programmiert und will dabei mehrere Werte zurückgeben. Dabei will ich diese Allg.dll-Tausche-Fkt in ein Delphi Prog aufrufen wie geht das (beim Ausführen kommt es immer ein Fehler)?
Code:
##################### C++ #########################
extern "C" unsigned int Tausche(int* a, int* b); void Tausche(int *a, int* b) { int temp; temp=*a; *a= *b; *b= temp; }
Delphi-Quellcode:
---------------------Delphi------------------
function Tausche(a, b: Integer) cdecl; external 'Allg.dll' index 1; Procedure TfrmMain.sbTestClick(Sender: TObject); begin Tausche(a, b); end; |
AW: C++DLL in Delphi mit Wertrückgabe ?
Was für einer?
Es wird ja Zeiger auf Integer erwartet |
AW: C++DLL in Delphi mit Wertrückgabe ?
Das ist aber nicht dein richtiger Code stimmts? Denn wenn ich das richtig sehe würde dieser Delphi-Code gar nicht kompilieren. Wenn dem wirklich so ist und du Hilfe erwartest so poste bitte den tatsächlichen Code.
|
AW: C++DLL in Delphi mit Wertrückgabe ?
Für diesen Code bräuchte man ja auch keine Dll
|
AW: C++DLL in Delphi mit Wertrückgabe ?
Moin Madina,
bist Du sicher, dass Deine C-Funktion es tut? Du deklarierst als Parameter Pointer auf Integer (Delhpi: PInteger), und vertauscht dann die Adressen, aber nicht die Werte (falls ich den Code richtig interpretiere, so C-fest bin ich nicht :wink:) Die Einbindung in Delphi müsste aber so aussehen:
Delphi-Quellcode:
Wenn Du var-Parameter übergibst, werden Pointer übergeben, oder Du übergibst gleich Pointer.
//---------------------Delphi------------------
function Tausche(var a, b: Integer) cdecl; external 'Allg.dll' index 1; // oder function Tausche(a, b: PInteger) cdecl; external 'Allg.dll' index 1; Procedure TfrmMain.sbTestClick(Sender: TObject); begin Tausche(a, b); // oder Tausche(@a,@b); end; |
AW: C++DLL in Delphi mit Wertrückgabe ?
Hallo,
richtig ich habe mich beeilt gehabt, sorry. 1. Jetzt habe ich mein Allg.dll umgeschrieben wie folgt, aber in Delphi kriege ich einen Fehler beim kompilieren: "Bezeichner erwartet, aber '@'gefunden" warum ? 2. wie kann von delphi aus auf diese C++Fkt zugreifen ? :
Delphi-Quellcode:
##################### C++ #########################
extern "C" unsigned int Tausche(int& a, int& b); void Tausche(int& a, int& b) { int temp= a; a= b; b= temp; } ---------------------Delphi------------------ function Tausche(@a, @b: Integer) cdecl; external 'Allg.dll' index 1; Procedure TfrmMain.sbTestClick(Sender: TObject); var a, b : Integer; begin a:= 5; b:= 10; Tausche(a, b); end; |
AW: C++DLL in Delphi mit Wertrückgabe ?
Nimm als Typ PInteger
|
AW: C++DLL in Delphi mit Wertrückgabe ?
@Christian Seehase: Die C-Funktion hat schon das richtige gemacht (und nicht nur die Pointerwerte vertauscht). Denn innerhalb der C-Funktion wurden die Pointer ja dereferenziert (durch den vorangestellten Stern).
@madina: Deine neue C-Funktion ist übrigens noch genau die gleiche wie im ersten Post. Denn:
Code:
und
void Tausche(int& a, int& b)
Code:
sind identisch. In beiden Fällen wird intern mit einem Pointer auf die Variablen gearbeitet. Der einzige Unterschied ist das du im Quelltext bei der einen Variante (der Variante mit &) nicht mehr dereferenzieren musst.
void Tausche(int *a, int* b)
Die Delphi Äquivalente zu den beiden Funktionen sehen dann übrigens so aus:
Delphi-Quellcode:
und
procedure Tausche(var a,b: Integer);
Delphi-Quellcode:
type
PInteger = ^Integer; [...] procedure Tausche(a,b: PInteger); |
AW: C++DLL in Delphi mit Wertrückgabe ?
Ich bin mir aber nicht sicher, ob der var-Parameter von der 2-Funktion dann richtig interpretiert wird
|
AW: C++DLL in Delphi mit Wertrückgabe ?
Delphi-Quellcode:
und
Tausche(var a, b: Integer)
Delphi-Quellcode:
sind delphieigene unterschiedlische Interpretierungen der selben Schnittstelle.
Tausche(a, b: PInteger)
Theoretisch wäre
Delphi-Quellcode:
auch genauso eine andere Interpretierung, aber Delphi kürzt hier bei Parametern unter 8 Byte den Pointer weg und übergibt nur den Wert, so als stünde kein Const davor.
Tausche(const a, b: Integer)
(Codeoptimierungen halt) |
AW: C++DLL in Delphi mit Wertrückgabe ?
Moin Himitsu,
das hier
Delphi-Quellcode:
würde zwar auch funktionieren, dann könnte man aber innerhalb der aufgerufenen Funktion die Werte von a und b ändern, ohne, dass der Aufrufer davon etwas mitbekäme, da sie als Kopie übergeben werden würden.
Tausche(a, b: PInteger)
Delphi-Quellcode:
wäre ähnlicher zu
Tausche(const a, b: PInteger)
Delphi-Quellcode:
, nur dass man eben auch nil als a bzw. b übergeben kann, was für die gezeigte Funktion aber etwas "ungünstig" wäre.
Tausche(var a, b: Integer)
Da man in C Werte ja nur via Pointer zum Ändern übergeben kann, ist die Variante mit const eigentlich die genauere Übersetzung (weswegen ich bei den API-Importen die Parameter auch immer mit const deklariere :wink:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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