Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme bei Übersetzung o. Aufruf einer C Funktion (https://www.delphipraxis.net/138833-probleme-bei-uebersetzung-o-aufruf-einer-c-funktion.html)

soulies 18. Aug 2009 10:33


Probleme bei Übersetzung o. Aufruf einer C Funktion
 
Hi,

irgendwie schaffe ich es nicht folgende C-Funktion richtig zu übersetzen oder aber aufzurufen.

C-Funktion:
Code:
EIB7_ERR EIB7Open(unsigned long ip, EIB7_HANDLE *eib, long timeout, char *ident, unsigned long len);
meine Übersetzung:
Delphi-Quellcode:
function EIB7Open(IP:Cardinal ; eib:PEIB7_HANDLE ; timeout:Cardinal; ident:PChar ; len:Cardinal): EIB7_ERR ;
EIB7_HANDLE : Integer ;
PEIB7_HANDLE : ^EIB7_HANDLE ;

mein Aufruf:
Delphi-Quellcode:
EIB7Open(FEIB_IPAdresse , @EIB_Handle, 5000 , PChar(FEIB_Firmware) , 100) ;
FEIB_IPAdresse : Cardinal ;
EIB_Handle : Integer ;
FEIB_Firmware : string ;


Bin für jeden Hinweis dankbar.

cya

[edit=mkinzler]Für C-Funktion Delphi-Tag durch C-Tag ersetzt Mfg, mkinzler[/edit]

Apollonius 18. Aug 2009 10:39

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
Du hast vergessen, uns den Fehler mitzuteilen. Ich würde tippen, dass die Aufrufkonvention falsch ist; versuch mal stdcall und cdecl.

soulies 18. Aug 2009 10:47

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
aufrufkonvention hatte ich vergessen mit anzugeben, waren aber da

Delphi-Quellcode:
function EIB7Open(IP:Cardinal; eib:PEIB7_HANDLE; timeout:Cardinal; ident:PChar; len:Cardinal): EIB7_ERR ; cdecl; external 'eib7.dll' ;
Der Fehler ist eine Zugriffsverletzung bei adresse '...' im Modul 'eib7.dll' .

Klaus01 18. Aug 2009 10:50

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
Welche Delphiversion nutzt Du?

Grüße
Klaus

soulies 18. Aug 2009 10:50

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
die Version ist:

Delphi 7 Enterprise

hoika 18. Aug 2009 10:58

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
Hallo,

also eine normales long ist in Delphi Integer,
das unsigned ist Cardinal, also schon mal richtig.

Aber hier fällt was auf.
PChar(FEIB_Firmware) , 100

Ist wirklich 100 Zeichen lang ?
FEIB_Firmware ist ja ein String, also variabel lang.
Wenn du 100 übergibst, will die c-Routine vielleicht auch 100 Zeichen schreiben (strncpy).

Schreib mal lieber

PChar(FEIB_Firmware), Length(FEIB_Firmware)

Ich mag übrigens dieses PChar Type-Cast nicht (obwohl es ja funktioniert)
und nehme immer array[0..X] of Char oder halt nen richtigen PChar,
aber das ist Ansichtssache.


#Update#:
FEIB_Firmware.SetLength(100) fehlt !!!

Das wird ja zurückgegeben.
Wie ich schon gesagt habe array[0..X] of Char und es gibt keinen Ärger.

#Update2:#
Wenn es immer noch klemmt, stdcall statt cdecl benutzen


Heiko

soulies 18. Aug 2009 11:39

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
habe das nun so geändert:

Delphi-Quellcode:
function EIB7Open(IP:Cardinal ; eib:PEIB7_HANDLE ; timeout:Integer ; ident:PChar ; len:Cardinal): EIB7_ERR ; cdecl; external 'eib7.dll' ;
aufruf:
Delphi-Quellcode:
EIB7Open(FEIB_IPAdresse , @EIB_Handle, 5000 , @FEIB_Firmware , 100);
// 100 ist max. möglich

mit
Delphi-Quellcode:
FEIB_Firmware : array[0..99] of char ;
so ist es OK.

danke.

hoika 18. Aug 2009 12:25

Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
 
Hallo,

die 100 würde ich ändern in

SizeOf(FEIB_Firmware)-1

Wichtig ist das -1,
weil wenn der Firmware-Name genau 100 Zeichen lang ist,
knallt es wieder (unter C gibt es noch #0 als Ende-Zeichen des Strings, dass muss ja auch mit hineinpassen).
OK, in Delphi jetzt auch ;)


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 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