AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array übergabe an C-DLL

Ein Thema von Blizzard · begonnen am 1. Sep 2005 · letzter Beitrag vom 1. Sep 2005
Antwort Antwort
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#1

Array übergabe an C-DLL

  Alt 1. Sep 2005, 10:33
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
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#2

Re: Array übergabe an C-DLL

  Alt 1. Sep 2005, 10:41
Hi.

Probier doch mal Service(UPLOAD, @arr[0], 5); anstatt Service(UPLOAD, arr, 5); Außerdem:
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)
  Mit Zitat antworten Zitat
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Array übergabe an C-DLL

  Alt 1. Sep 2005, 10:50
nope leider genau der gleiche effekt.
allerdings muss man wohl PInteger anstatt ^integer verwenden zumindest mag das andere mein delphi ned.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4

Re: Array übergabe an C-DLL

  Alt 1. Sep 2005, 11:24
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.
  Mit Zitat antworten Zitat
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Array übergabe an C-DLL

  Alt 1. Sep 2005, 12:41


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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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