Hallo zusammen,
ich hab ein Problem mit Delphi und c++ und habe keine Ahnung mehr wie ich weitermachen sollte
. Habe schon sehr sehr viel versucht aber noch nie di richtige Lösung gefunden.
Mein Problem ist folgendes.
Ich sollte ein dynamisches Array einer c++
dll übergeben. Diese sollte im Array Änderungen vornehmen. Nach der Ausführung der
Dll muss ich aber das Array wieder im Delphi bearbeiten.
Die Übergabe an die
Dll funktioniert super. Das Array wird auch von der
Dll bearbeitet. Nur wenn ich in Delphi wieder darauf zugreifen möchte, dann bekomm ich nur ein leeres Array (lauter 0).
Kann mir bitte jemand sagen was da falsch sein könnte?
Die Deklaration in C++ sieht so aus:
extern "C" _declspec(dllexport) bool forwardFFTbool(double *out, double *dat, int x, int y, int z);
Das Einbinden der
DLL in Delphi:
Delphi-Quellcode:
forwardFFTbool:
function(
var outdat:PDouble;dat: TDim; x:Integer; y:Integer; z:Integer): boolean
stdcall {$IFDEF WIN32} cdecl {$ENDIF};
reverseFFTbool:
function(
var outdat:PDouble;dat: TDim; x:Integer; y:Integer; z:Integer): boolean
stdcall {$IFDEF WIN32} cdecl {$ENDIF};
Die Methode in der alles berechnet wird lautet folgendermaßen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var g,gg,b:PDouble;
//TDim;//PDouble; //PDinArray;
res:Boolean;
width, height, length,i,j,l,val,arlength,id:Integer;
y:TDim;
h1,h2:THandle;
f:
String;
begin
width:= arrY;
height:=arrX;
length:=arrZ;
arlength := height*length*width*SizeOf(Double)*2;
h1:=GlobalAlloc(GHND,arlength);
h2:=GlobalAlloc(GHND,arlength);
g := GlobalLock(h1);
b := GlobalLock(h2);
res:= forwardFFTbool(g,arra,height,width,length);
gg := @g;
if res= true
then begin
SetLength(y,height*length*width*SizeOf(Double)*2);
id := 0;
for l:= 0
to length-1
do begin
for i:=0
to Height-1
do begin
for j:= 0
to Width -1
do begin
y[(height*width*l)+(i*Width +j)] := gg^;
//g[(height*width*l)+(i*Width +j)];//g^;
Inc(gg);
end;
end;
end;
res := reverseFFTbool(b,y,height,width,length);
if res= true
then begin
txtStatus.Text := '
RFFT Com ok!';
txtStatus.Font.Color := clGreen;
end else begin
txtStatus.Text := '
RFFT Com not ok!';
txtStatus.Font.Color := clRed;
end;
end else begin
txtStatus.Text := '
RFFT Com not ok!';
txtStatus.Font.Color := clRed;
end;
GlobalUnlock(h1);
Globalfree(h1);
GlobalUnlock(h2);
Globalfree(h2);
end;
irgendwer eine Idee?
Danke im voraus
mfg
Stefan