Entwickler-Ecke
Sonstiges (Delphi) - C++ > Delphi
R4Y - Mi 23.12.09 22:34
Titel: C++ > Delphi
Hallo,
ich habe seid langer zeit mal wieder ein Problem.
Ich verusche grad ein SDK nach Delphi zu portieren.
Nun scheitere ich an einer Struct.
Quelltext
1: 2: 3: 4:
| struct TS3Functions { unsigned int (*getPlaybackDeviceList)(int modeID, char**** result); } |
nun weiß ich nicht, wie ich diese zeile nach Delphi umschreiben kann.
Wenn mir da jemand helfen könnte, wäre das super.
grüße
Maurice
BenBE - Do 24.12.09 00:01
R4Y hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4:
| struct TS3Functions { unsigned int (*getPlaybackDeviceList)(int modeID, char**** result); } | |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type PPChar = ^PChar; PPPChar = ^PPChar; PPPPChar = ^PPPChar;
TPlaybackDeviceListFunc = function (modeID: Integer; Result: PPPPChar): DWORD; stdcall;
TS3Functions = record getPlaybackDeviceList: TPlaybackDeviceListFunc; end; |
Zwecks Aufrufkonvention ggf. mal schauen, dürft aber
stdcall sein. Ansonsten
cdecl probieren.
elundril - Do 24.12.09 05:14
eine kleine frage dazu, was bringt sich ein 3-facher Pointer auf nen Character-String? (wenn ichs richtig interpretiert habe)
lg elundril
R4Y - Do 24.12.09 12:18
super danke das sieht doch hilfreich aus :)
aber wäre das nicht eigentlich
Quelltext
1:
| PlaybackDeviceListFunc:^TPlaybackDeviceListFunc; |
wegen dem pointer?
@elundril
so wie ich das sehe ist das ein 3D array auf eine StringList .. wozu auch immer ^^
BenBE - Do 24.12.09 13:34
elundril hat folgendes geschrieben : |
eine kleine frage dazu, was bringt sich ein 3-facher Pointer auf nen Character-String? (wenn ichs richtig interpretiert habe)
lg elundril |
In C und C++ sind Arrays und Pointer analog. Von daher kann man das entweder als Pointer übersetzen, oder als Array. Rein aus Portabilitätsgründen sollte man aber für andere Programmiersprachen i.d.R. die Pointer-Version vorziehen.
R4Y hat folgendes geschrieben : |
super danke das sieht doch hilfreich aus :)
aber wäre das nicht eigentlich
Quelltext 1:
| PlaybackDeviceListFunc:^TPlaybackDeviceListFunc; |
wegen dem pointer? |
Nein. In C ist
void (name *) (void); die generelle Angabe für einen Funktionszeiger. Ohne den Stern wäre es nämlich eine Funktionsdeklaration, was logisch wird, wenn man weiß, dass in C innerhalb eines Records Funktionen supported werden (wozu auch immer man das braucht).
In Delphi wird bereits anhand der Syntax klar, dass keine Funktionsdeklaration gemeint sein kann, weshalb hier die Angabe eine expliziten Pointers notwendig ist: Vielmehr ist der Zeiger bereits implizit in der Typdeklaration enthalten.
R4Y hat folgendes geschrieben : |
@elundril
so wie ich das sehe ist das ein 3D array auf eine StringList .. wozu auch immer ^^ |
Korrekt. Terminiert durch je einen Nullzeiger i.d.R. Sei denn, du hast da vorgegebene Konstanten für einzelnen Dimensionen.
R4Y - So 27.12.09 13:43
ich hab da nochmal ne frage ^^
wie übersetzt man einen enum ohne namen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| enum { CODEC_SPEEX_NARROWBAND = 0, CODEC_SPEEX_WIDEBAND, CODEC_SPEEX_ULTRAWIDEBAND, CODEC_CELT_MONO, CODEC_DUMMY_MONO, }; |
enums mit namen sind ja kein problem
Delphi-Quelltext
1:
| type irgendwas = (a,b,c); |
nur was ist, wenn da kein name steht?
grüße
Maurice
finalizat0r - So 27.12.09 15:38
Dann musst du dem Enum bzw. dem Type einen Namen geben! Ich hätte das so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TS3CODECS = ( CODEC_SPEEX_NARROWBAND = 0, CODEC_SPEEX_WIDEBAND, CODEC_SPEEX_ULTRAWIDEBAND, CODEC_CELT_MONO, CODEC_DUMMY_MONO ); |
Ich hab schon unzählige Programm für TeamSpeak 2 Programmiert (Viewer, Admin Tools etc) außer fürs SDK. Wenn du willst kriegst du die (Mit Delphi 2006 Compiliert).
R4Y - So 27.12.09 21:11
ich übersetze mir ja das gesammte sdk nach Delphi ^^
nur ich kann dem enum ja nicht einfach einen namen geben.
was mich auch viel mehr interessiert, was macht ein enum ohne namen in c++?
elundril - Mo 28.12.09 12:07
warum kannst du einem Enum keinen Namen geben? der Name dient doch afaik eh nur den Programmieren damit die das Ding irgendwie ansprechen können und is dem Programmcode dann eh schnuppe?
lg elundril
BenBE - Mo 28.12.09 12:13
Enums ohne Namen werden in C(++) oft als Ersatz für Konstanten eingesetzt.
Ansonsten halt wie oben beschrieben.
R4Y - Mo 28.12.09 13:53
okay dann werde ich sie einfach als konstante deklarieren.
danke ;)
R4Y - Sa 02.01.10 04:02
ich habe jetzt das sdk komplett compilierfähig nach Delphi übersetzt.
allerdings schmiert jetzt TeamSpeak ab beim laden des plugins ^^
vllt kann hier jmd drüberschauen und mir sagen was ich beim portieren falsch gemacht habe.
grüße
Maurice
Astat - Sa 02.01.10 07:08
R4Y hat folgendes geschrieben : |
allerdings schmiert jetzt TeamSpeak ab beim laden des plugins ^^
vllt kann hier jmd drüberschauen und mir sagen was ich beim portieren falsch gemacht habe.
|
Hallo R4Y, was sagt denn der Debuger und Windebug, wenn Du die DLL startest (Host Teamviewer)?
Wo in Welcher Unit und Zeile krachts denn?
Die Pointer auf Pointer auf Pointer auf PChar kommen mir sehr merkwürdig vor?
PPPChar = ^PPChar;
PPPPChar = ^PPPChar;
Habe allerdings SDK noch nicht gecheckt, möchte auf Deine Debugantwort warten? "g"
lg. Astat
R4Y - Sa 02.01.10 14:13
das ist ja das, was mich nervt.
teamspeak erstelllt keinen crashdump oder gibt debug infos aus.
es schließt sich einfach.
mit nem debugger kommt ich auch net ran :/
R4Y - Di 05.01.10 05:24
ich verstehe nicht ganz, wie ich die programme anwenden muss ^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!