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++ Delphi arrays (https://www.delphipraxis.net/94343-c-delphi-arrays.html)

Tim Henford 20. Jun 2007 10:06


C++ Delphi arrays
 
Hallo,

ich habe eine C++ DLL, die folgendendermaßen aufgebaut ist:
Code:
extern "C" short EXPORT test (double *x)
{
MessageBox (GetActiveWindow(), _fcvt(x[0], 2, &dec, &sign), "DLLTEST",MB_OK|MB_ICONINFORMATION);
}
In Delphi möcht ich nun die Funktion aufrufen und die Parameter übereben:

Delphi-Quellcode:
type
  TExte = array of Extended;

type                                    
  TTest = function (x: TExte): Smallint; stdcall;


var
  vekX : TExte;
begin
  dll:= LoadLibrary('test.dll');
  @test := GetProcAddress(dll,'test');
  SetLength(vekX,1);
  vekX[0]:= 5;
  r:=test(vekX);
end;

Das klappt aber nicht, denn die MsgBox zeigt nichts an-was mach ich da falsch?

Danke Tim

Phoenix 20. Jun 2007 10:08

Re: C++ Delphi arrays
 
Bitte packe erstmal [ Delphi ] - Tags um Deinen Code. Das macht den ungemein lesbarer.

ste_ett 20. Jun 2007 10:14

Re: C++ Delphi arrays
 
Versuch mal

Delphi-Quellcode:
  r:=test(@vekX[0]);

Robert Marquardt 20. Jun 2007 10:33

Re: C++ Delphi arrays
 
Ziemlich falsch. Erstens ist double = Double, zweitens ist die Delphi-Deklaration der Funktion falsch.
Delphi-Quellcode:
type
  PDouble = ^Double;

type                                    
  TTest = function(x: PDouble): Smallint; stdcall;

var
  vekX: array of Double;
begin
  dll := LoadLibrary('test.dll');
  @test := GetProcAddress(dll, 'test');
  SetLength(vekX, 1);
  vekX[0] := 5;
  r := test(@vekX[0]);
end;
So sollte es gehen.

Willst du nicht ein array von Double-Werten handhaben, sondern nur genau einen Double-Wert, dann besser mit var arbeiten.
Delphi-Quellcode:
type                                    
  TTest = function(var x: Double): Smallint; stdcall;

var
  vekX: Double;
begin
  dll := LoadLibrary('test.dll');
  @test := GetProcAddress(dll, 'test');
  vekX := 5;
  r := test(vekX);
end;
Auf C-Seite pruef mal nach ob EXPORT wirklich zu stdcall aufgeloest wird. Das sollte nicht nur in den Projektoptionen gesetzt sein.

Tim Henford 20. Jun 2007 15:38

Re: C++ Delphi arrays
 
Super! Danke das funktioniert schonmal soweit

Wie würde es denn gehen das gesamte array zuübergeben?
Delphi-Quellcode:
r := test(@vekX);
Scheint da nicht zu funktionieren?

SirThornberry 20. Jun 2007 15:39

Re: C++ Delphi arrays
 
du verstehst den Quelltext nicht? Richtig? Es wird zur zeit die Adrese übergeben wo der Speicherbereich des Arrays beginnt. Es wird also nicht ein einzelnes Array-Element übergeben sondern die Adresse des gesamten Arrays (welche gleichzeitig die Adresse des ersten elementes ist)

Robert Marquardt 20. Jun 2007 15:43

Re: C++ Delphi arrays
 
Damit das richtig funktioniert muss natuerlich auch noch die Anzahl Elemente im array mit uebergeben werden. Dazu braucht man natuerlich einen zweiten Parameter.

Tim Henford 20. Jun 2007 15:48

Re: C++ Delphi arrays
 
Ja leider hab ich beim Arbeiten mit Arrays und Pointern noch ein kleines Verständnisproblem.


Ja, also die Adresse des Speicherbereichs, an dem das Array beginnt wird mittels
Delphi-Quellcode:
vekX[0]:=5; vekX[1]:=7;
r:= test(@vekX, 2);
übergeben.

Nun dacht ich mit C++ via
Code:
short Test (double *x,int anz))
{
MessageBox (GetActiveWindow(), _fcvt(x[1],... //==7
}
wieder daraufzugreifen zu können?

Danke

[edit=SirThornberry]C-Code-Tags gesetzt - Mfg, SirThornberry[/edit]

SirThornberry 20. Jun 2007 16:00

Re: C++ Delphi arrays
 
du übergibst doch nur einen Pointer auf einen Double. Du musst also den Pointer weiter rücken. Hier ein Beispiel
Code:
void DoAnything2(float* Data)
{
  for (int i = 0; i <= 10; i++)
  {
    *Data = i * 2; //i * 2 dem Arrayelement zuweisen
    Data = Data + sizeof(Data); //zum nächsten Arrayelement weiter rücken
  }
}
Es wird ein Pointer auf ein Array of float übergeben. In Der Schleife wird dann in den Float was geschrieben und Data wird auf das nächste Element des Arrays weiter gerückt.

Apollonius 20. Jun 2007 16:19

Re: C++ Delphi arrays
 
Zitat:

Code:
Data = Data + sizeof(Data);

Meiner Meinung nach eher
Code:
Data = Data + sizeof(*Data);
Ich will das ganze doch um die Größe des Inhalts weiterrücken. Oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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