DLL exportiert Symbole falsch



  • Ich habe hier ein Problem mit einem VC-Projekt. Ich habe ein DLL-Projekt ohne MFC. Die DLL soll diverse Symbole exportieren. Leider macht sie das falsch:

    So wird eine Funktion bla() per GetProcAddress(handle,"bla") nicht gefunden, erst wenn ich GetProcAddress(handle,"?bla@@YAJXZ") aufrufe, klappt es.

    Woher kommt dieses Verhalten und wie kann ich das ändern? Ich kann es ja keinem Anwender zumuten, so was aufzurufen...



  • Gib bei deiner Funktion "extern "C"" an, dann wird der Funktionsname nur noch um ein "_" ergänz (normal wird er nämlich beim kompilieren noch um Angaben zu verwendeten Dytentypen u.ä. ergänzt). Das ist die Namensgebung von C.

    Also z.B. so:

    extern "C" int bla()    {
    }
    

    Und dann so aufrufen:

    GetProcAddress(handle,"_bla")
    


  • Das wäre dann ein kleiner Fortschritt, aber der Unterstrich muss sich ja auch noch weg bekommen lassen!? Schließlich verlangen z.B. die OGG-DLLs so was ja auch nicht...



  • Kanns ein deinem .def File liegen?



  • Nicht unbedingt!

    Die Namenskendung mit dem _ ist in C standard, die Erweiterung anhand der Variablen und co ist in C++ standard (aber auch da von Compiler zu Compiler unterschiedlich). Also musst du dich mit deinem Compiler ausseinander setzen!

    Es könnte aber auch sein, dass es nichtgeht, und die DLL's vom OGG Vorbis nicht in C++ geschrieben wurden; da bin ich mir nicht ganz sicher...



  • Hi!

    Die DLL's sind zwar für mich noch absolutes Neuland, aber wie wärs denn mit

    GetProcAddress(hModule, _T("Bla"));
    

    das

    extern "C"
    

    brauchst du aber trotzdem.

    Nur mal so als Idee am Rande!

    Grüße CyberGonzo



  • GetProcAddress(hModule, _T("Bla"));
    

    Das ist so nicht hilfeich, da die DLL die Symbole ja korrekt exportieren soll - die Lösung oben doktert ja nur beim Importieren an den Symptomen herum.

    Wie ich mittlerweile heraus bekommen habe, liegt die Ursache darin, dass das Ganze ein C++-Projekt ist - biege ich es auf C um, werden die Symbole korrekt exportiert. Das würde - wenn man es nicht ändern kann - dann aber bedeuten, dass sich C++ nicht eignet, um DLLs zu schreiben, die sprachenunabhängig genutzt werden können?



  • Nachtrag: Dass "extern (C)" den Symbolen einen "_" voranstellt, ist schlichtweg falsch - damit klappt es wie gewünscht.


Anmelden zum Antworten