Allgemeine Frage zu DLLs



  • Hallo,

    ich hab mein Problem aus dem Beitrag weiter unten in den Griff bekommen, aber nur indem ich meinen DLL-Header so aufgebaut habe:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //hier die Funktion ShowInt
    
    #ifdef __cplusplus
    }
    #endif
    

    Jetzt stellt sich mir die Frage: Wieso brauche ich dieses extern "C" { }, damit der Zeiger auf die Funktion im Hauptprogramm nicht NULL ist? Kann ich die DLL an sich so ändern, dass ich das nicht brauche und es im Programm (wo ich sie dynamisch linke) trotzdem klappt?

    Denn vorher hab ich mit einem Testprogramm herausgefunden, dass er zwar die DLL fand, aber mit GetProcAddress nie einen gültigen Zeiger gefunden hat.

    greets



  • Nachdem man C++ Funktionen überladen kann, werden da noch alle möglichen anderen Informationen zum Namen dazugeschrieben (name mangling). Das schaut dann z.B. so aus: _Z10FileExistsRK10AnsiString

    Du kannst diese Namen schon verwenden, aber dann musst du GetProcAddress natürlich diesen komplizierten Namen übergeben. Und rausfinden z.B. mit dumpbin. Ich weiß allerdings nicht, ob dieses Name mangling bei allen VC++-Versionen gleich ist.



  • Also wenn ich extern "C" dazuschreibe, dann findet man im Hauptprogramm die Namen der Funktionen.
    Was ist denn der Unterschied zu extern "C++"? Würde es damit auch gehen?



  • ne geht extern c++ geht ned

    aber mit extern c exportierte funktionen vertehen glaub die meisten programmiersprachen



  • OK Danke, hab mir jetzt auch in nem Buch nochmal angeschaut, was dieses extern "C" genau bedeutet 😉


Anmelden zum Antworten