Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C++ Headerdatei in Pascal (https://www.delphipraxis.net/158310-c-headerdatei-pascal.html)

NickelM 13. Feb 2011 02:57

Delphi-Version: 2009

C++ Headerdatei in Pascal
 
Hallo ihr,

Ich bin gerade dabei das TS3 Plugin SDK von C++ in Pascal zuübersetzen. Soweit sogut.
Nur am übersetzen eines structs, der Funktionen enthält, funkt irgendwas net.

Eine Funktion als Beispiel, die ich verwenden wollte:
Code:
//Auszug von einen anderen Datei für Definition
//des anyid types (hab ich weggelassen da ich net weis ich das übersetzen soll)
#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32)
   typedef unsigned __int16 anyID;
   typedef unsigned __int64 uint64;
   #ifdef BUILDING_DLL
      #define EXPORTDLL __declspec(dllexport)
   #else
      #define EXPORTDLL
   #endif
#else
   #include <stdint.h>
   typedef uint16_t anyID;
   typedef uint64_t uint64;
   #ifdef BUILDING_DLL
      #define EXPORTDLL __attribute__ ((visibility("default")))
   #else
      #define EXPORTDLL
   #endif
#endif

//Aus der "Problemdatei"
#ifdef __cplusplus
extern "C" {
#endif
struct TS3Functions {
unsigned int (*requestSendPrivateTextMsg)(uint64 serverConnectionHandlerID, const char* message, anyID targetClientID, const char* returnCode);
}
Ich hab das jetzt bisher so übersetzt:
Delphi-Quellcode:
type
anyID = Word;

TrequestSendPrivateTextMsg = function (serverConnectionHandlerID : uint64; const message : PAnsiChar; targetClientID : anyID; const returnCode : PAnsiChar) : Cardinal; //Muss PAnsiChar sein, da es keine Unicode zeichen sind

TTS3Functions = record
requestSendPrivateTextMsg : TrequestSendPrivateTextMsg;
end;
Hat es was mit den Teilen zutun die ich rausgelassen habe? das mit dem extern "c" weis ich hat was mit exportieren der Funktionen zutun.
Wenn ich aber an die Funktion ein cdecl; dranhäng, ändert sich nichts.

Ich muss zugeben mit den Grundlagen und Typumwundlung gehts ja noch, aber bei solchen Compiler "Anweisungen" bin ich überfragt...

NickelM 14. Feb 2011 03:35

AW: C++ Headerdatei in Pascal
 
*push*

phade 14. Feb 2011 09:19

AW: C++ Headerdatei in Pascal
 
function (...): Cardinal; stdcall;

Robotiker 14. Feb 2011 11:16

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von NickelM (Beitrag 1081348)
Hallo ihr,
Nur am übersetzen eines structs, der Funktionen enthält, funkt irgendwas net.

Der struct enthält keine Funktion, sondern einen Zeiger auf eine Funktion.

Assarbad 14. Feb 2011 11:24

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von phade (Beitrag 1081512)
function (...): Cardinal; stdcall;

Wieso? Normal wäre __cdecl, aber das hängt komplett vom Compiler ab - kann man also nicht sagen.

NickelM 15. Feb 2011 04:44

AW: C++ Headerdatei in Pascal
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es geht mir darum, stimmt das soweit oder nicht? Soll ich jetzt also an jeden Pointer einer Funktion cdecl danhängen? Weil es muss cdecl sein, da die Funktionen, die dan exportiert werden, auch nur mit cdecl funktionieren.

EDIT: Ich hab jetzt mal an jedem Pointer der Funktion cdecl; angehängt.
Bei manchen Funktionene sind auch float enthalten diese hab ich als Single gemacht. Liegt es vllt dadurch an eine Verschiebung der Adressen sowas?
Es kommt immer noch der gleiche Fehler (siehe Anhang)

turboPASCAL 15. Feb 2011 06:21

AW: C++ Headerdatei in Pascal
 
Wie jetzt, Delphi schmeisst VisualStudio-Fehler ? :gruebel: :stupid:

Assarbad 16. Feb 2011 00:54

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von turboPASCAL (Beitrag 1081759)
Wie jetzt, Delphi schmeisst VisualStudio-Fehler ? :gruebel: :stupid:

Nee, das bedeutet nur daß der JIT-Debugger von VS installiert und konfiguriert ist.

Zitat:

Zitat von NickelM (Beitrag 1081758)
Es geht mir darum, stimmt das soweit oder nicht? Soll ich jetzt also an jeden Pointer einer Funktion cdecl danhängen? Weil es muss cdecl sein, da die Funktionen, die dan exportiert werden, auch nur mit cdecl funktionieren.

Nein, nicht an jeden. Interessant ist was die Orginaleinstellung des Projektes ist. Üblicherweise ist dies __cdecl. Wichtig ist es aber nur dort wo eine Schnittstelle mit dem anderen Code existiert.

Zitat:

Zitat von NickelM (Beitrag 1081758)
EDIT: Ich hab jetzt mal an jedem Pointer der Funktion cdecl; angehängt.

Wie gesagt, es geht darum, daß der Prototyp __cdecl ist, wenn das Elternprojekt (also der Code welcher dein Plugin aufruft) __cdecl ist. Und das muß dokumentiert sein oder es ist die Standardeinstellung (und das ist __cdecl).

Zitat:

Zitat von NickelM (Beitrag 1081758)
Bei manchen Funktionene sind auch float enthalten diese hab ich als Single gemacht. Liegt es vllt dadurch an eine Verschiebung der Adressen sowas?
Es kommt immer noch der gleiche Fehler (siehe Anhang)

float (C/C++) ist Single (Delphi). Sie sollten binärkompatibel sein.

Aber wir bräuchten schon mehr Infos. Bspw. welche Exception geworfen wird. Oder du gibst uns mindestens die Binärdateien, so daß wir es im Debugger/Disassembler anschauen können.

NickelM 16. Feb 2011 17:50

AW: C++ Headerdatei in Pascal
 
Liste der Anhänge anzeigen (Anzahl: 2)
Naja okay. Das Programm Teamspeak 3 schemiste eine dmp datei raus. Ich lade sie mal hoch gugt mal ob ihr damit was anfangen könnt.

Weil ich persönlich kann mit der Datei nichts anfangen. Kenn mich da auch nicht so aus xD.
Ich stell auch mal den Originalcode der Datei rein. Die txt ist eine .h Datei.

Assarbad 16. Feb 2011 20:57

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von NickelM (Beitrag 1082292)
Naja okay. Das Programm Teamspeak 3 schemiste eine dmp datei raus. Ich lade sie mal hoch gugt mal ob ihr damit was anfangen könnt.

Die Dump-Datei wäre nochmal so gut, wenn die Debugsymbole (.pdb-Dateien) dabei wären ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.
Seite 1 von 2  1 2      

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