Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Abgelietet Klasse aus so laden.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.05.2007, 12:28 Uhr
FunnyDingo



Hallo zusammen,

ja, ich schon wieder *g* .oO(langsam bekomme ich echt ein schlechtes gewissen, so viel zu Fragen). Also ich versuche gerade, eine abgelietete Klasse aus einem so zu laden. Mein Hautpprogramm kennt die Klasse class_npmbase. In dem so ist eine Abgeleitete Klasse class_npmhttp. Ich dachte mir nun: jau, einfach mit dlopen() laden und lässt die eine Referenz auf eine Instanz zurück geben. leichter gesagt als getan. Der Code zum laden sieht so aus (die Variablen sollen später noch durch structs ersetzte werden, dies war nur erstmal zum testen):

C++:
void *handle = dlopen("npm/http.so", RTLD_NOW);
if (handle == NULL)
{
    std::cout << "DlError: " << dlerror() << std::endl;
    return false;
}
void *symbol = dlsym(handle, "npmGetInstance");
if (symbol == NULL)
{
    std::cout << "DlError: " << dlerror() << std::endl;
    return false;
}
    class_npmbase *npmHttp = NULL;
void (*npmGetInstance)(class_npmbase*) = (void (*)(class_npmbase*))symbol;
npmGetInstance(npmHttp);
std::cout << "npmHttp: " << npmHttp << std::endl;
npmHttp->listen();
std::cout << "npmHttp: " << npmHttp << std::endl;


Und die npmGetInstance so:

C++:
extern "C" {
void npmGetInstance(class_npmhttp *ptr)
{
    std::cout << "npmGetInstance(" << ptr << ")" << std::endl;
    ptr = &class_npmhttp::instance();
    std::cout << "Ptr: " << ptr << ", Addr: " << &class_npmhttp::instance() << std::endl;
}
}


Das ist die Ausgabe:

Code:
npmGetInstance(0)
class_npmbase Konstuktor
npmhttp Konstruktor
Ptr: 0xb7f9b028, Addr: 0xb7f9b028
npmHttp: 0
LOADING BASE NPM
npmHttp: 0



Ich habe es schon auf mehrer Arten probiert:
class_npmhttp &npmGetInstance()
class_npmhttp *npmgetInstance()
und halt die oben zu sehende Variante

Wenn ich aber npmHttp->listen() aufrufe, wird nicht die listen-Methode der class_npmhttp, sondern die der class_npmbase aufgerufen. Was ich auch nicht verstehe: wenn npmHttp 0 ist, dann müsste es doch nen Speicherzugriffsfehler geben, oder nicht!?

Gruß,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 30.05.2007 um 12:30 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.05.2007, 12:38 Uhr
virtual
Sexiest Bit alive
(Operator)


Da fehlt ne Indirektion (beachte Anzahl der *):

C++:
extern "C" {
void npmGetInstance(class_npmhttp **ptr)
{
    std::cout << "npmGetInstance(" << ptr << ")" << std::endl;
    *ptr = &class_npmhttp::instance();
    std::cout << "Ptr: " << *ptr << ", Addr: " << &class_npmhttp::instance() << std::endl;
}
}

...
void (*npmGetInstance)(class_npmbase*) = (void (*)(class_npmbase*))symbol;
npmGetInstance(&npmHttp);


Alternativ kannst du auch mit Referenzen arbeiten oder eben npmGetInstance gleich den Pointer zurückgeben lassen
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.05.2007, 12:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Achso, noch was zur letzten Frage:

Es muß nicht zwingend eine Speicherzugriffsfehler geben, daß ist eben undefiniertes Verhalten. Ich denke, in Deinem Fall kommen halt zwei Dinge zusammen:
1. listen() ist keine virtuelle Methode
2. In listen() werden keine Membervariablen oder virtuelle Methoden aufgerufen.

Das führt dann dazu, daß wenn Du Dir this in listen ausgeben lassen würdest, eben NULL zurückgeliefert wurde. Da aber keine member angesprochen werden und nicht die VMT benutzt werden muß (unter der Annahme, daß listen eben nicht virtuell ist), wird auf den Objektzeiger niemals zugegriffen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.05.2007, 13:27 Uhr
FunnyDingo



Oh man, bin ich doof *g*

Ich habe mich nun für die Variante mit der direkten Rückgabe des Pointers entschieden. Funktioniert hat es dann immer noch nicht, bis ich deinen zweiten Post gelesen habe. Ich habe in der class_npmbase die Methode listen nicht virtuell gemacht. Dann ist doch klar, dass ich beim Aufruf meiner npmHTTP->listen immer die Listen-Methode der class_npmbase statt die überladene der class_npmhttp bekommen habe.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 30.05.2007 um 13:28 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: