![]() |
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:
meine Übersetzung:
EIB7_ERR EIB7Open(unsigned long ip, EIB7_HANDLE *eib, long timeout, char *ident, unsigned long len);
Delphi-Quellcode:
EIB7_HANDLE : Integer ;
function EIB7Open(IP:Cardinal ; eib:PEIB7_HANDLE ; timeout:Cardinal; ident:PChar ; len:Cardinal): EIB7_ERR ;
PEIB7_HANDLE : ^EIB7_HANDLE ; mein Aufruf:
Delphi-Quellcode:
FEIB_IPAdresse : Cardinal ;
EIB7Open(FEIB_IPAdresse , @EIB_Handle, 5000 , PChar(FEIB_Firmware) , 100) ;
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] |
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.
|
Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
aufrufkonvention hatte ich vergessen mit anzugeben, waren aber da
Delphi-Quellcode:
Der Fehler ist eine Zugriffsverletzung bei adresse '...' im Modul 'eib7.dll' .
function EIB7Open(IP:Cardinal; eib:PEIB7_HANDLE; timeout:Cardinal; ident:PChar; len:Cardinal): EIB7_ERR ; cdecl; external 'eib7.dll' ;
|
Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
Welche Delphiversion nutzt Du?
Grüße Klaus |
Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
die Version ist:
Delphi 7 Enterprise |
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 |
Re: Probleme bei Übersetzung o. Aufruf einer C Funktion
habe das nun so geändert:
Delphi-Quellcode:
aufruf:
function EIB7Open(IP:Cardinal ; eib:PEIB7_HANDLE ; timeout:Integer ; ident:PChar ; len:Cardinal): EIB7_ERR ; cdecl; external 'eib7.dll' ;
Delphi-Quellcode:
// 100 ist max. möglich
EIB7Open(FEIB_IPAdresse , @EIB_Handle, 5000 , @FEIB_Firmware , 100);
mit
Delphi-Quellcode:
so ist es OK.
FEIB_Firmware : array[0..99] of char ;
danke. |
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 02:11 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