Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Kann das wer in Delphi übersetzten?
Tobi482 - Mo 10.07.06 16:58
Titel: Kann das wer in Delphi übersetzten?
Hi Leute,
ich bräuchte einmal etwas Hilfe um diese Zeilen C-Code in Delphi zu übersetzten.
Dies sind Zeilen aus einem C Netzwerkclient, den ich gerade versuche umzuschreiben.
Quelltext
1: 2: 3: 4: 5:
| extern "C" { BOOL EXPORT OnCommandLine(char* argv[], int argc); WORD EXPORT OnSent(LPBYTE pbPacket, WORD wLen); WORD EXPORT OnRecv(LPBYTE pbPacket, WORD wLen); } |
Mit freundlichen Grüßen
Tobi
Delete - Mo 10.07.06 17:49
Hi Tobi. :wave:
Ohne Gewähr und Pistole:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TCStringArray = ^PChar;
function OnCommandLine(argv : TCStringArray; argc : integer) : boolean; cdecl; function OnSent(pbPacket : PByte; wLen : word) : word; cdecl; function OnRecv(pbPacket : PByte; wLen : word) : boolean; cdecl; |
Nur das
EXPORT (nicht das
EXTERN :autsch:) bekomm ich irgendwie nicht so ganz mit rein...
Gruß,
Waldteufel
tommie-lie - Mo 10.07.06 18:39
Waldteufel hat folgendes geschrieben: |
| Nur das EXTERN bekomm ich irgendwie nicht so ganz mit rein... |
Das weist einen C++-Compiler an, die Funktionsnamen C-kompatibel zu behalten, also ohne C++-typisches Name Mangling.
Allerdings hast du das EXPORT-Macro vergessen, das höchstwahrscheinlich die Funktionen in die Exporttabelle eines PE schreiben soll. Unter Delphi sind entsprechend die Funktionsnamen unter dem Export-Abschnitt einzutragen.
Außerdem
kann das Macro auch eine Spezifizikation des ABI enthalten. In dem Fall müsste man das Macro finden und schauen, ob zum Beispiel stdcall als Calling Convention benutzt wird.
Wenn du den Client allerdings komplett in Delphi neu schreiben willst, kannst du natürlich das Delphi-spezifische ABI verwenden und einfach die Calling Convention weglassen (auch Waldteufels "cdecl").
Für das
char *-Array kann man übrigens auch einfach "array of PChar" verwenden und dann einen Pointer auf das erste Element übergeben. Ich weiß nicht, ob Delphi den Zugriff auf Pointer über einen Index erlaubt. Falls nicht, erleichtert ein Array gegenüber einem Zeiger die Handhabbarkeit, weil man einfach
meinevariable[42] = 'blubb' schreiben kann und nicht aufwändig
PChar(Integer(meinevariable) + 42 * sizeof(PCHar))^ := 'blubb'.
BenBE - Mo 10.07.06 21:34
@tommie-lie: Wenn Du:
Delphi-Quelltext
1: 2: 3:
| type TPCharArray = Array of PChar; PPcharArray = ^TPCharArray; |
meinst, dann sollte man der Vollständigkeit
DeinArray^[42] = 'blubb'; verwenden, ansonsten geht das aber ...
tommie-lie - Mo 10.07.06 21:39
BenBE hat folgendes geschrieben: |
@tommie-lie: Wenn Du:
Delphi-Quelltext 1: 2: 3:
| type TPCharArray = Array of PChar; PPcharArray = ^TPCharArray; |
meinst, dann sollte man der Vollständigkeit DeinArray^[42] = 'blubb'; verwenden, ansonsten geht das aber ... |
Ne, ich meine
TPCharArray = array of PChar, Zugriff über
MeinArray[42] := 'blubb' und Übergabe als
MeineFunktion(@MeinArray[0]). Bei deiner Variante bin ich mir nicht sicher, was geschieht, wenn man ein statisches Array draus macht und es nicht nullindiziert ist (was nicht heißt, das deine Lösung dann nicht auch funktionieren würde).
C-Arrays sind einfach nur Zeiger auf das erste Element des Arrays, also geb' ich sie ihm mit @Array[0] doch, wenn er sie haben will ;-) Ist für mich "straightforward".
BenBE - Mo 10.07.06 21:53
@tommie-lie: Sinds unter Delphi auch nur. Selbst bei dynamischen Arrays. Einziger Unterschied ist, dass an Offset -4 noch die Länge und Offset -8 der Referenz-Zähler folgt (IIRC bei zweiterem).
Tobi482 - Di 29.01.08 14:13
Hab ganz vergessen diesen Thread zu beenden
Danke nocheinmal für eure Hilfe
Mit freundlichen Grüßen
Tobi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!