Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Mo 10.07.06 16:58 
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.

ausblenden 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
Waldteufel
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.07.06 17:49 
Hi Tobi. :wave:

Ohne Gewähr und Pistole:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TCStringArray = ^PChar;
  // PByte = ^Byte; // weiß nicht, ob der nicht schon definiert ist...

// ...

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


Zuletzt bearbeitet von Waldteufel am Mo 10.07.06 18:57, insgesamt 1-mal bearbeitet
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 10.07.06 18:39 
user profile iconWaldteufel 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'.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 10.07.06 21:34 
@tommie-lie: Wenn Du:
ausblenden 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 ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 10.07.06 21:39 
user profile iconBenBE hat folgendes geschrieben:
@tommie-lie: Wenn Du:
ausblenden 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".

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Di 29.01.08 14:13 
Hab ganz vergessen diesen Thread zu beenden
Danke nocheinmal für eure Hilfe

Mit freundlichen Grüßen
Tobi