Delphi-PRAXiS

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 ;)

NickelM 17. Feb 2011 06:22

AW: C++ Headerdatei in Pascal
 
Problem ist...hab ich nicht.. TS3 spuckt nur die Meldung und das aus mehr net.
Das Programm istr nämlich eine Fremdanwendung xD

Assarbad 17. Feb 2011 13:36

AW: C++ Headerdatei in Pascal
 
Auslösende Datei ist:

Code:
0:000> lmvm musik_vuplayer
start   end       module name
01fa0000 01fca000   musik_vuplayer T (no symbols)          
    Loaded symbol image file: musik_vuplayer.dll
    Image path: C:\Programme\TeamSpeak 3 Client\plugins\musik_vuplayer.dll
    Image name: musik_vuplayer.dll
    Timestamp:       Tue Feb 15 06:18:18 2011 (4D5A1AAA)
    CheckSum:        00000000
    ImageSize:       0002A000
    File version:    0.0.0.0
    Product version: 0.0.0.0
    File flags:      0 (Mask 0)
    File OS:         0 Unknown Base
    File type:       0.0 Unknown
    File date:       00000000.00000000
    Translations:    0000.04b0 0000.04e4 0409.04b0 0409.04e4
Viel mehr kann man schon nicht entnehmen, weil es nur ein Minidump ist (sprich: nicht der komplette Speicherinhalt ist verfügbar)

NickelM 17. Feb 2011 20:07

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von Assarbad (Beitrag 1082458)
Auslösende Datei ist:

Code:
0:000> lmvm musik_vuplayer
start   end       module name
01fa0000 01fca000   musik_vuplayer T (no symbols)        
    Loaded symbol image file: musik_vuplayer.dll
    Image path: C:\Programme\TeamSpeak 3 Client\plugins\musik_vuplayer.dll
    Image name: musik_vuplayer.dll
    Timestamp:       Tue Feb 15 06:18:18 2011 (4D5A1AAA)
    CheckSum:        00000000
    ImageSize:       0002A000
    File version:    0.0.0.0
    Product version: 0.0.0.0
    File flags:      0 (Mask 0)
    File OS:         0 Unknown Base
    File type:       0.0 Unknown
    File date:       00000000.00000000
    Translations:    0000.04b0 0000.04e4 0409.04b0 0409.04e4
Viel mehr kann man schon nicht entnehmen, weil es nur ein Minidump ist (sprich: nicht der komplette Speicherinhalt ist verfügbar)

no symbols....hmm kann es sein das das auf einen nicht zugewissenen pointer hindeutet?...Weil die Anwendung übergibt die pointer zu den Funktionen mit einer exportierten Prozedur. Also in der DLL muss eine Funktion exportiert werden (was ich aber schon gemacht habe), die nach dem initalisieren der DLL von der anwendung aufgerufen wird. Diese Prozedur hat eine const parameter, den Record, den ich dann intern in der DLL speichern muss. Dies sieht dan so aus:

Delphi-Quellcode:
var TS3Func : TTS3Functions; // der Record;

procedure ts3plugin_setFunctionPointers(const funcs : TTS3Functions); cdecl; //der Parameter wird von der Anwendung festgelegt (zumindest sieht es so aus, in dem Originalcode
begin
TS3Func := funcs;
end;

//Und hier der Aufruf
function ts3plugin_onTextMessageEvent(serverConnectionHandlerID : uint64; targetMode : anyID; toID : anyID; fromID : anyID; const fromName : PAnsiChar; const fromUniqueIdentifier : PAnsiChar; const message : PAnsiChar; ffIgnored : Integer) : Integer; cdecl;
begin
if TS3Func.requestSendPrivateTextMsg(serverConnectionHandlerID,'test',fromID,nil) = 0 then
begin
end
end;
Hier der Original Beispielcode aus der .c Datei:
Code:
static struct TS3Functions ts3Functions;

/* Set TeamSpeak 3 callback functions */
void ts3plugin_setFunctionPointers(const struct TS3Functions funcs) {
    ts3Functions = funcs;

//Hier die Beispiel funktion in dem gleichen Zusammenhang, wie ich sie auch verwenden will
int ts3plugin_onTextMessageEvent(uint64 serverConnectionHandlerID, anyID targetMode, anyID toID, anyID fromID, const char* fromName, const char* fromUniqueIdentifier, const char* message, int ffIgnored) {

if(ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, "Text message back!", fromID, NULL) != ERROR_ok)
{

}

}
Wie gesagt aufrufen tut er die exportierte funktion, nur beim aufruf der Callback funktionen bekomm ich den fehler rausgeschmiessen (ich ruf ja dafor einmal PostMessage wegen meinem Sinn des Plugins machen. Es kommt auch an und er macht es auch, nur die Funktion will net.
Wenn ich es rauskommentiere gehts. Also auf jedenfall liegt es daran.

EDIT: Liegt es vllt daran? In dem Originalcode steh sowas noch am Anfang:
Code:
#pragma warning (disable : 4100) /* Disable Unreferenced parameter warning */
Dies hab ich zur Sicherheit so gemacht:
Delphi-Quellcode:
(*$HPPEMIT '#pragma warning (disable : 4100)' *) //oder hat das bzw. ist das falsch übersetzt?

Assarbad 17. Feb 2011 22:09

AW: C++ Headerdatei in Pascal
 
Zitat:

Zitat von NickelM (Beitrag 1082560)
no symbols....hmm kann es sein das das auf einen nicht zugewissenen pointer hindeutet?...

Nee, das deutet darauf hin, daß es für deine DLL (da ist es normal weil die Delphi ist) und für den Elternprozeß (nicht in der Ausgabe enthalten) keine gültigen Debugsymbole gibt.

Zitat:

Zitat von NickelM (Beitrag 1082560)
Delphi-Quellcode:
(*$HPPEMIT '#pragma warning (disable : 4100)' *) //oder hat das bzw. ist das falsch übersetzt?

Das dürfte falsch sein. Warnungen sind compiler-spezifisch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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