Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Übersetzung C -> Delphi (https://www.delphipraxis.net/135083-uebersetzung-c-delphi.html)

Nersgatt 4. Jun 2009 14:14


Übersetzung C -> Delphi
 
Hallo,

ich habe etwas Probleme, eine Header-Datei von C nach Delphi 2006 zu übersetzen.
Ich habe folgende Deklaration:
Code:
DLL_EXPORT signed int FAR PASCAL searchReader(int* port, unsigned char* version, unsigned char* type);
Diese habe ich so übersetzt:
Delphi-Quellcode:
  Function searchReader(var port : Integer;
                        var version : PChar;
                        var &type : PChar) : Integer; external 'IFreader.dll';
Aufruf der Funktion:
Delphi-Quellcode:
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;
Beim Aufruf der Funktion bekomme ich jedoch eine Zugriffsverletzung. Kann mir jemand sagen, was ich falsch mache?

Danke!
Jens

mkinzler 4. Jun 2009 14:17

Re: Übersetzung C -> Delphi
 
Transferiere mal version und type zuvor in lokale Variablen

Nersgatt 4. Jun 2009 14:24

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?

mkinzler 4. Jun 2009 14:27

Re: Übersetzung C -> Delphi
 
Delphi-Quellcode:
version, xtype : string;
begin

  res := SearchReader(port, PChar(version), PChar(xtype));

Nersgatt 4. Jun 2009 14:29

Re: Übersetzung C -> Delphi
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
version, xtype : string;
begin

  res := SearchReader(port, PChar(version), PChar(xtype));

Das geht leider nicht:
[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.

mkinzler 4. Jun 2009 14:36

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;
...
?

Nersgatt 4. Jun 2009 14:43

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.

mkinzler 4. Jun 2009 14:44

Re: Übersetzung C -> Delphi
 
Hast du mal testweise das var weggelassen?

Nersgatt 4. Jun 2009 14:46

Re: Übersetzung C -> Delphi
 
Auch dann habe ich die selbe Fehlermeldung.

Satty67 4. Jun 2009 14:52

Re: Übersetzung C -> Delphi
 
Sorry, falls unqualifiziert: Ist unsigned char* nicht eher PByte?

inherited 4. Jun 2009 15:20

Re: Übersetzung C -> Delphi
 
Nein, das passt schon.
Aber im Header steht was von int* type, müsste es also nicht besser PInteger sein?

tomsson74 4. Jun 2009 15:31

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

Nersgatt 4. Jun 2009 15:35

Re: Übersetzung C -> Delphi
 
Zitat:

Zitat von inherited
Nein, das passt schon.
Aber im Header steht was von int* type, müsste es also nicht besser PInteger sein?

Auch das bringt leider keine Änderung. Ich habe andere Funktionen, wo z.B.
Code:
unsignt int * value
deklariert ist. Diese habe ich mit
Delphi-Quellcode:
var value : LongWord
übersetzt. Die funktionieren Wunderbar...

inherited 4. Jun 2009 16:31

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.

Nersgatt 4. Jun 2009 16:41

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 17:23 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