Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Function Pointer

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
18.04.2007, 22:29 Uhr
FunnyDingo



Hallo zusammen,

ich muss schon wieder nerven. Ich verstehe hier etwas nicht. Ich öffne mit dlopen() eine .so und möchte auf eine Funktion zugreife. Das Funktioniert auch. Nun kommt das schöne:
diese (C) Funktion (ich nenne sie npmRegister) soll zwei Function-Pointer übergeben bekommen, diese mit den Adressen zweier (C++) Funktionen füllen damit ich die in meinem Hauptprogramm verwenden kann.

Hauptgramm

C++:
bool load()
{
    struct dynlib dl;
    strcpy(dl.file, "xxx.so"); // nur temporär
    dl.handle = dlopen(dl.file, RTLD_NOW);
    if (dl.handle == NULL)
        throw yacexception("Can't open dynamic shared library '" + std::string(dl.file) + "'", __FILE__, __LINE__);

    dl.symbol = dlsym(dl.handle, "npmRegister");
    if (dl.symbol == NULL)
        throw yacexception("dlopen() error: " + std::string(dlerror()), __FILE__, __LINE__);

    dl.func = (bool (*)(void(*)(), void(*)()))dl.symbol;
    void (*send)();
    void (*listen)();
    if (dl.func(send, listen) == false)
        throw yacexception("Can't register NPM in file '" + std::string(dl.file) + "'", __FILE__, __LINE__);

    dlerror();
    send();
    listen();
    return true;
}

dnylib sieht so aus:

C++:
struct dynlib {
    char file[256];
    void *handle;
    void *symbol;
    bool (*func)(void(*)(), void(*)());
};

Hier das eingebundene .so

C++:
#include <iostream>
#include <string>
#include "../error/error.h";

void listen()
{
    std::cout << "listen() has been called" << std::endl;
}

void send()
{
    std::cout << "send() has been called" << std::endl;
}


extern "C" {
bool npmRegister(void(*pListen)(), void(*pSend)())
{
    pListen = listen;
    pSend = send;
    return true;
}
}


Wenn ich das laufen lasse, gibts nen SegFault. Hab mir das mit dem gdb mal angesehen, werde aber nicht schlau draus. Der ruft die send() auf, dann ein mcount() (wo auch immer die herkommt) und dann gibts den SegFault.

Vielleicht sieht ja jemand von euch meinen Fehler.

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 18.04.2007 um 22:33 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2007, 22:57 Uhr
ao

(Operator)



Zitat von FunnyDingo:


C++:
bool load()
{
    /* ... */
    void (*send)();
    void (*listen)();
    if (dl.func(send, listen) == false)
        throw yacexception("Can't register NPM in file '" + std::string(dl.file) + "'", __FILE__, __LINE__);

    dlerror();
    send();
    listen();
    return true;
}




Ich glaube, dass du send und listen nicht initialisierst. Das müsste so geschehen:


C++:
bool load()
{
    /* ... */
    void (*send)();
    void (*listen)();
    if (dl.func(&send, &listen) == false)
}

Vor dem Aufruf von dl.func zeigen send und listen in den Wald. Verfolg mal mit dem Debugger, ob die das hinterher auch noch tun.

ao

Dieser Post wurde am 18.04.2007 um 22:58 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.04.2007, 08:08 Uhr
Kest
saint


Hi!

Bei mir funzt, wenn ich

C++:
extern "C" {
bool npmRegister(void(**pListen)(), void(**pSend)()){
    *pListen = listen;
    *pSend = send;
    return true;
    }
}

und

C++:
if (dl.func(&send, &listen) == false)

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 19.04.2007 um 08:44 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.04.2007, 09:11 Uhr
FunnyDingo



Ja, so wie Kest läufts, super vielen Dank ;-)
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
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: