 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 01.10.2016, 14:44 Titel: Namensvergebung von exportierten Methoden eines Objektes |
|
|
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 ) 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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4559 Wohnort: ~/
|
Verfasst am: 01.10.2016, 15:11 Titel: |
|
|
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 |
|
 |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 01.10.2016, 15:24 Titel: |
|
|
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?  _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 947 Wohnort: Austria
|
|
Nach oben |
|
 |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 01.10.2016, 17:20 Titel: |
|
|
Danke für die Antwort. Die Informationen helfen mir ungemein  _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
 |
|
|
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.
|
|