Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Array übergabe an C-DLL (https://www.delphipraxis.net/52662-array-uebergabe-c-dll.html)

Blizzard 1. Sep 2005 09:33


Array übergabe an C-DLL
 
Hi Leute,
ich hab folgendes Problem:
Ich hab den Header einer C-DLL und dazu eine kleine beispiel anwendung in C. Ich hab jetzt versucht beide in Delphi umzusetzen und hab nun das Problem das ich nach dem aufruf der DLL funktion fehler an völlig "schwachsinnigen" stellen bekomme. Soll heißen das ich z.B. ne exception beim nächsten aufruf von Showmessage außerhalb der funktion die die dll aufruft bekomme. (kann auch ne andere funktion als showmessage sein).

Hier mal der C Header der funktion:
Code:
typedef unsigned char      BYTE;
int Service(BYTE n1, int* d,int n2);
und der beispiel Code:
Code:
{
   int RetVal=0,array[10],RetAnzahl;
   unsigned char RetBuffer[500];

   RetAnzahl=30;

   array[0]=ID;
   array[1]=VERSION;
   array[2]=(int)&RetAnzahl;
   array[3]=(int)&RetBuffer[0];
   array[4]=100;

   Service(UPLOAD,array,5);

   RetBuffer[RetAnzahl]=0;
   m_wndView.Add("Versionsnummer",RetBuffer);
}
und dann noch meine Umsetzung der Funktion:
Delphi-Quellcode:
Service: function(n1: BYTE;      //Service ID
                         var d: array of integer;  //Pointer auf Array
                         n2: Integer)     //Array größe
                         : Integer cdecl stdcall;
und der aufruf:
Delphi-Quellcode:
var
    RetAnzahl: integer;
    arr: array [0..9] of Integer;
    RetBuffer: array [0..499] of Char;
begin
   RetAnzahl := 30;

   arr[0] := ID;
   arr[1] := VERSION;
   arr[2] := integer(@RetAnzahl);
   arr[3] := integer(@RetBuffer[0]);
   arr[4] := 500;

   Service(UPLOAD,arr,5);


   RetBuffer[RetAnzahl] := #0;

   result := copy(String(RetBuffer),1,RetAnzahl);
end;
(ID, VERSION und UPLOAD und integer constanten)

Jemand ne idee was ich falsch mache?
Ich vermute mal dass, ich obwohl ich den korrekten wert von der DLL zurückgeliefert bekomme, ein Pointer nicht stimmt und die dll mir deswegen in irgendwelche falschen speicherbereiche schreibt. Aber ich hab wirklich schon alles mögliche ausprobiert und bin jetzt mit meinem Latein absolut am ende :( .

Hoffe einer von den C/Delphi Gurus hier kann mir helfen.

mfg
Blizzard

Waldteufel 1. Sep 2005 09:41

Re: Array übergabe an C-DLL
 
Hi.

Probier doch mal
Delphi-Quellcode:
Service(UPLOAD, @arr[0], 5);
anstatt
Delphi-Quellcode:
Service(UPLOAD, arr, 5);
Außerdem:
Delphi-Quellcode:
Service: function(n1 : byte; d : ^integer; n2 : Integer) : Integer cdecl stdcall;
(sonst übergibst du nämlich im 2. Parameter einen Pointer auf einen Pointer auf das erste Element des Arrays)

Blizzard 1. Sep 2005 09:50

Re: Array übergabe an C-DLL
 
nope leider genau der gleiche effekt.
allerdings muss man wohl PInteger anstatt ^integer verwenden zumindest mag das andere mein delphi ned.

tommie-lie 1. Sep 2005 10:24

Re: Array übergabe an C-DLL
 
Zitat:

Zitat von Blizzard
und dann noch meine Umsetzung der Funktion:
Delphi-Quellcode:
Service: function(n1: BYTE;      //Service ID
                         var d: array of integer;  //Pointer auf Array
                         n2: Integer)     //Array größe
                         : Integer cdecl stdcall;

Was zum Teufel sit das denn? Du hast zwei verschiedene Aufrufkonventionen benutzt, und dem Fehler nach zu urteilen wird die letztere angewandt. cdecl ist bei in dem Fall die einzige Wahrheit ;-)
Außerdem ist deine Übersetzung des C-Arrays, wie Waldteufel schon angemerkt hatte, falsch. Seine beiden Korrekturen zusammen (Übergabe eines PInteger und Funktionsaufruf mit einem Zeiger auf das erste Element im Array) sind eigentlich richtig.

Blizzard 1. Sep 2005 11:41

Re: Array übergabe an C-DLL
 
:dancer:

Thx das wars.
Ich muss zugeben das ich von der Materie nicht alzu viel ahnung habe. Die übersetzung des C Header hab ich größtenteils vom DLL Header Converter des Jedi Projectes machen lassen und dann nur noch minimal angepasst. Und der hat diesen Teil so ausgespuckt.

mfg
Blizzard


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

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