![]() |
Übersetzung C -> Delphi
Hallo,
ich habe etwas Probleme, eine Header-Datei von C nach Delphi 2006 zu übersetzen. Ich habe folgende Deklaration:
Code:
Diese habe ich so übersetzt:
DLL_EXPORT signed int FAR PASCAL searchReader(int* port, unsigned char* version, unsigned char* type);
Delphi-Quellcode:
Aufruf der Funktion:
Function searchReader(var port : Integer;
var version : PChar; var &type : PChar) : Integer; external 'IFreader.dll';
Delphi-Quellcode:
Beim Aufruf der Funktion bekomme ich jedoch eine Zugriffsverletzung. Kann mir jemand sagen, was ich falsch mache?
var port, res : Integer;
version, xtype : PChar; begin res := SearchReader(port, version, xtype); if res >= 0 then begin lstStatus.Items.add('SearchReader successful'); lstStatus.Items.add('Port: ' + intToStr(Port)); lstStatus.Items.add('Version: ' + Version); lstStatus.Items.add('Type: ' + xType); end else begin lstStatus.Items.add('SearchReader Error: ' + intToStr(res)); end; end; Danke! Jens |
Re: Übersetzung C -> Delphi
Transferiere mal version und type zuvor in lokale Variablen
|
Re: Übersetzung C -> Delphi
Hm, Bahnhof...? :oops:
Ich habe doch im Aufruf Version und Type als lokale Variablen deklariert. Das ist vermutlich nicht das, was Du meinst, oder? |
Re: Übersetzung C -> Delphi
Delphi-Quellcode:
version, xtype : string;
begin res := SearchReader(port, PChar(version), PChar(xtype)); |
Re: Übersetzung C -> Delphi
Zitat:
[Pascal Fehler] unitfrmMain.pas(33): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden Version und Type sind ja Rückgabewerte der Funktion. Daher auch als VAR deklariert. |
Re: Übersetzung C -> Delphi
Funktioniert:
Delphi-Quellcode:
?
...
var version, xtype : PChar; sversion, stype: string; begin res := SearchReader(port, version, xtype); if res >= 0 then begin sversion := version; stype := xtype; lstStatus.Items.add('SearchReader successful'); lstStatus.Items.add('Port: ' + intToStr(Port)); lstStatus.Items.add('Version: ' + sversion); lstStatus.Items.add('Type: ' + sType); end; ... |
Re: Übersetzung C -> Delphi
Leider nein, aber das ist ja auch im Prinzip das selbe, wie meine erste Version.
Aufruf von res := SearchReader(port, version, xtype); wobei version und xtype als PChar deklariert sind. Bei Dir wird nur nachher aus dem PChar ein String gemacht. Die Zugriffsverletzung tritt ja schon beim Aufruf von SearchReader auf. |
Re: Übersetzung C -> Delphi
Hast du mal testweise das var weggelassen?
|
Re: Übersetzung C -> Delphi
Auch dann habe ich die selbe Fehlermeldung.
|
Re: Übersetzung C -> Delphi
Sorry, falls unqualifiziert: Ist unsigned char* nicht eher PByte?
|
Re: Übersetzung C -> Delphi
Nein, das passt schon.
Aber im Header steht was von int* type, müsste es also nicht besser PInteger sein? |
Re: Übersetzung C -> Delphi
Nur mal so gefragt:
Die enstprechende DLL (IFreader.dll) befindet sich schon im Projektverzeichnis und wenn nicht, ist es sichergestellt dass diese von deinem Programm auch "sichtbar" ist ? /Thomas |
Re: Übersetzung C -> Delphi
Zitat:
Code:
deklariert ist. Diese habe ich mit
unsignt int * value
Delphi-Quellcode:
übersetzt. Die funktionieren Wunderbar...
var value : LongWord
|
Re: Übersetzung C -> Delphi
Hast du vielleicht noch den C-Quellcode eines entsprechenden Aufrufs der funktioniert? Vielleicht erwartet die Funktion, dass der Speicher für die PChars bereits reserviert wurde.
|
Re: Übersetzung C -> Delphi
Hihi, das fragst Du gerade in der Minute, wo ich das Notebook runtergefahren und verpackt habe :mrgreen:
Ich werde nächste Woche nochmals schauen, ist auf jeden Fall ein guter Hinweis. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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 by Thomas Breitkreuz