![]() |
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:
und der beispiel Code:
typedef unsigned char BYTE;
int Service(BYTE n1, int* d,int n2);
Code:
und dann noch meine Umsetzung der Funktion:
{
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); }
Delphi-Quellcode:
und der aufruf:
Service: function(n1: BYTE; //Service ID
var d: array of integer; //Pointer auf Array n2: Integer) //Array größe : Integer cdecl stdcall;
Delphi-Quellcode:
(ID, VERSION und UPLOAD und integer constanten)
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; 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 |
Re: Array übergabe an C-DLL
Hi.
Probier doch mal
Delphi-Quellcode:
anstatt
Service(UPLOAD, @arr[0], 5);
Delphi-Quellcode:
Außerdem:
Service(UPLOAD, arr, 5);
Delphi-Quellcode:
(sonst übergibst du nämlich im 2. Parameter einen Pointer auf einen Pointer auf das erste Element des Arrays)
Service: function(n1 : byte; d : ^integer; n2 : Integer) : Integer cdecl stdcall;
|
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. |
Re: Array übergabe an C-DLL
Zitat:
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. |
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 07:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz