Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Namensvergebung von exportierten Methoden eines Objektes

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 01.10.2016, 13:44    Titel: Namensvergebung von exportierten Methoden eines Objektes Antworten mit Zitat

Hallo, ich bin nicht ganz sicher ob ich das richtige Unterforum erwischt habe. Vielleicht wäre der Thread auch im "Profi" Forum besser aufgehoben. Nun denn, ich erstelle eine DLL unter Windows (wer hät's gedacht happy) und arbeite da mit einem UDT. Dieses UDT enthält Funktionen die ich exportiere.

Quellcode:
Code:
Type Math
   Private:
      Dim x As Integer
      Dim y As Integer
      
   Public:
      Declare Sub setX(As Integer)
      Declare Sub setY(As Integer)
      
      Declare Function getX() As Integer
      Declare Function getY() As Integer
End Type


Sub Math.setX(value As Integer) Export
   this.x = value
End Sub


Sub Math.setY(value As Integer) Export
   this.y = value
End Sub


Function Math.getX() As Integer Export
   Return this.x
End Function


Function Math.getY() As Integer Export
   Return this.y
End Function



Function newMath() As Math Ptr Export
   Return New Math
End Function


Sub delMath(obj As Math Ptr) Export
   Delete obj
End Sub
[/code]

Beim Kompilieren lasse ich mir zusätzlich die Assemblerdatei mit ausgeben:

Code:
typedef   signed char       int8;
typedef unsigned char      uint8;
typedef   signed short      int16;
typedef unsigned short     uint16;
typedef   signed int        int32;
typedef unsigned int       uint32;
typedef   signed long long  int64;
typedef unsigned long long uint64;
typedef struct { char *data; int64 len; int64 size; } FBSTRING;
typedef int8 boolean;
struct $4MATH {
   int64 X;
   int64 Y;
};
#define __FB_STATIC_ASSERT( expr ) extern int __$fb_structsizecheck[(expr) ? 1 : -1]
__FB_STATIC_ASSERT( sizeof( struct $4MATH ) == 16 );
void* malloc( uint64 );
void free( void* );
void fb_Init( int32, uint8**, int32 );
static int32 tmp$2( int32, uint8** );

int64 DllMain( void* __FB_DLLINSTANCE__$1, uint64 __FB_DLLREASON__$1, void* __FB_DLLRESERVED__$1 )
{
   int64 fb$result$1;
   __builtin_memset( &fb$result$1, 0, 8ll );
   label$2:;
   fb$result$1 = 1ll;
   if( __FB_DLLREASON__$1 != 1ull ) goto label$4;
   tmp$2( 0, (uint8**)0ull );
   label$4:;
   label$3:;
   return fb$result$1;
}

void _ZN4MATH4SETXEu7INTEGER( struct $4MATH* THIS$1, int64 VALUE$1 )
{
   label$5:;
   *(int64*)THIS$1 = VALUE$1;
   label$6:;
}

void _ZN4MATH4SETYEu7INTEGER( struct $4MATH* THIS$1, int64 VALUE$1 )
{
   label$7:;
   *(int64*)((uint8*)THIS$1 + 8ll) = VALUE$1;
   label$8:;
}

int64 _ZN4MATH4GETXEv( struct $4MATH* THIS$1 )
{
   int64 fb$result$1;
   __builtin_memset( &fb$result$1, 0, 8ll );
   label$9:;
   fb$result$1 = *(int64*)THIS$1;
   goto label$10;
   label$10:;
   return fb$result$1;
}

int64 _ZN4MATH4GETYEv( struct $4MATH* THIS$1 )
{
   int64 fb$result$1;
   __builtin_memset( &fb$result$1, 0, 8ll );
   label$11:;
   fb$result$1 = *(int64*)((uint8*)THIS$1 + 8ll);
   goto label$12;
   label$12:;
   return fb$result$1;
}

struct $4MATH* NEWMATH( void )
{
   struct $4MATH* TMP$3$1;
   struct $4MATH* fb$result$1;
   __builtin_memset( &fb$result$1, 0, 8ll );
   label$13:;
   void* vr$1 = malloc( 16ull );
   TMP$3$1 = (struct $4MATH*)vr$1;
   __builtin_memset( TMP$3$1, 0, 16ull );
   fb$result$1 = TMP$3$1;
   goto label$14;
   label$14:;
   return fb$result$1;
}

void DELMATH( struct $4MATH* OBJ$1 )
{
   label$15:;
   if( OBJ$1 == (struct $4MATH*)0ull ) goto label$17;
   free( (void*)OBJ$1 );
   label$17:;
   label$16:;
}

static int32 tmp$2( int32 __FB_ARGC__$0, uint8** __FB_ARGV__$0 )
{
   int32 fb$result$0;
   __builtin_memset( &fb$result$0, 0, 4ll );
   fb_Init( __FB_ARGC__$0, __FB_ARGV__$0, 0 );
   label$0:;
   label$1:;
   return fb$result$0;
}

__asm__(
   ".section .drectve\n"
   "\t.ascii \" -export:\\\"_ZN4MATH4SETXEu7INTEGER\\\"\"\n"
   "\t.ascii \" -export:\\\"_ZN4MATH4SETYEu7INTEGER\\\"\"\n"
   "\t.ascii \" -export:\\\"_ZN4MATH4GETXEv\\\"\"\n"
   "\t.ascii \" -export:\\\"_ZN4MATH4GETYEv\\\"\"\n"
   "\t.ascii \" -export:\\\"NEWMATH\\\"\"\n"
   "\t.ascii \" -export:\\\"DELMATH\\\"\"\n"
);


Daraus kann ich ablesen, dass folgende 6 Funktionen exportiert wurden:

Code:
_ZN4MATH4SETXEu7INTEGER --> Math.SetX Methode
_ZN4MATH4SETYEu7INTEGER -> Math.setY Methode
_ZN4MATH4GETXEv -> Math.getX Methode
_ZN4MATH4GETYEv -> Math.getY Methode
NEWMATH -> NewMath Funktion
DELMATH -> DelMath Funktion


Die letzten beideren sind ja von der Namensgebung relativ schlüssig, jedoch muss ich auch auf die ersten 4 zugreifen. Ich schreibe eine DLL welche in einer Sprache ohne OOP genutzt werden soll. Da ich ja weiß dass die ersten 4 Methoden unter diesen 4 Namen exportiert werden, kann ich locker durch die Pointer Übergabe quasi auf die Daten mit den Methoden zugreifen und das auf das Objekt selber anwenden.

Das ist alles kein Problem, jedoch würde ich gerne wissen ob es irgendwo spezifiziert ist, wie die Namensvergebung bei Methoden deklariert ist. Ich meine, es wird ja da irgendeine Struktur hinter der Namensvergebung geben, ist diese irgendwo dokumentiert? Ich finde kein passenden Artikel dazu in der Hilfe.

Ansonsten, lassen sich die Namen auch in FreeBASIC vor der Kompilierung spezifisch angeben? Also die Namen wie sie auch von außen her angesprochen werden können.
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.10.2016, 14:11    Titel: Antworten mit Zitat

Ich habe mich mit DLLs bisher nicht nicht beschäftigt - hilft dir ALIAS?

Die Namensgebung wird ganz (ganzganz) kurz im Artikel https://www.freebasic-portal.de/befehlsreferenz/extern-end-extern-268.html angeschnitten; vielleicht hilft dir das weiter.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 01.10.2016, 14:24    Titel: Antworten mit Zitat

Ja, hilft mir zumindest ein bisschen. Nach weiteren Recherchen bin ich auf "Name Mangling" gestoßen. Im Prinzip will und muss ich wissen wie der Compiler die Methoden letztendlich bennent. Da muss es eine Struktur hinter geben, finde aber zum erbrechen keine Spezifikation dazu.

ALIAS selber hilft in dem Fall nicht. Gibt es weitere Möglichkeiten den Compiler vorzuschreiben wie die Funktionen nach außen hin heißen sollen? durchgeknallt
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 01.10.2016, 15:30    Titel: Antworten mit Zitat

Soweit ich weiß verwendet FB ein zu GCC/g++ kompatibles Name-Mangling.

Wie das funktioniert findest du z.B. hier, Kapitel 8.5:
http://www.agner.org/optimize/calling_conventions.pdf

Falls du dir die FBC implementierung anschaun willst:
https://github.com/freebasic/fbc/blob/master/src/compiler/symb-mangling.bas

Für Methoden, die C++ spezifische Funktionen verwenden (wie beispielsweise Methoden in UDT oder überladene Methoden) kommst du vermutlich nicht um das C++ name mangling herum. Bei "normalen" (C-kompatiblen) Funktionen kannst du das angewandte Name-Mangling hingegen u.a. mit ALIAS beeinflussen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 01.10.2016, 16:20    Titel: Antworten mit Zitat

Danke für die Antwort. Die Informationen helfen mir ungemein grinsen
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz