Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++DLL in Delphi mit Wertrückgabe ? (https://www.delphipraxis.net/154503-c-dll-delphi-mit-wertrueckgabe.html)

madina 13. Sep 2010 19:46


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;

mkinzler 13. Sep 2010 19:49

AW: C++DLL in Delphi mit Wertrückgabe ?
 
Was für einer?
Es wird ja Zeiger auf Integer erwartet

SirThornberry 13. Sep 2010 20:13

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.

mkinzler 13. Sep 2010 20:19

AW: C++DLL in Delphi mit Wertrückgabe ?
 
Für diesen Code bräuchte man ja auch keine Dll

Christian Seehase 13. Sep 2010 21:15

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:
//---------------------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;
Wenn Du var-Parameter übergibst, werden Pointer übergeben, oder Du übergibst gleich Pointer.

madina 15. Sep 2010 19:52

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;

mkinzler 15. Sep 2010 19:55

AW: C++DLL in Delphi mit Wertrückgabe ?
 
Nimm als Typ PInteger

SirThornberry 16. Sep 2010 08:52

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:
void Tausche(int& a, int& b)
und
Code:
void Tausche(int *a, int* b)
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.

Die Delphi Äquivalente zu den beiden Funktionen sehen dann übrigens so aus:
Delphi-Quellcode:
procedure Tausche(var a,b: Integer);
und
Delphi-Quellcode:
type
  PInteger = ^Integer;
[...]
procedure Tausche(a,b: PInteger);

mkinzler 16. Sep 2010 13:37

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

himitsu 16. Sep 2010 13:46

AW: C++DLL in Delphi mit Wertrückgabe ?
 
Delphi-Quellcode:
Tausche(var a, b: Integer)
und
Delphi-Quellcode:
Tausche(a, b: PInteger)
sind delphieigene unterschiedlische Interpretierungen der selben Schnittstelle.

Theoretisch wäre
Delphi-Quellcode:
Tausche(const a, b: Integer)
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.
(Codeoptimierungen halt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr.
Seite 1 von 2  1 2      

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