Einzelnen Beitrag anzeigen

hubestef

Registriert seit: 19. Mai 2008
4 Beiträge
 
#1

Delphi dynamisches Array an C++Dll übergeben

  Alt 19. Mai 2008, 09:40
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
  Mit Zitat antworten Zitat