DLL dynamisch einbinden, Probleme mit Funktionsnamen



  • Servus

    ich habe eine DLL geschrieben die ich dynamisch in mein Projekt einbinden möchte
    Die Adresse einer Funktion aus der DLL bekomme ich durch

    p_JWFLIN_SendMessage  = ( LPFNDLLLIN_1) 
    GetProcAddress(LinDllDynPara.hDLL, "JWFLIN_SendMessage")
    

    allerdings wird die Funktion in der DLL erst mit folgendem Funktionsnamen gefunden, ?JWFLIN_GetMessage@@YAHPAD@Z

    diesen habe ich gefunden, durch das öffnen der DLL mit einem Textexitor.

    Nun habe ich aber auch DLL bei denen ich deren Funktionen über den tatsächlichen Namen einbinden kann. Warum wird der Funktionsname beim erstellen der DLL geändert und welche Einstellungen muss ich beim compilen ändern, damit ich das Problem nicht mehr habe....



  • Stichwort: Name Mangling

    In C++ gibt es Überladungen, das heißt der Name "JWFLIN_SendMessage" könnte mehrdeutig sein (der Compiler kann noch anhand der Parametertypen entscheiden, welche Version richtig ist, der Linker sieht "nur" die Namen), deshalb werden in den Namen noch die Parametertypen der Funktion (und einige weitere Informationen) reincodiert.

    Um das zu verhindern, mußt du die Funktion auf C-Bindung umstellen (da gibt es keine Überladung mehr, im Gegenzug werden Namen 1:1 übernommen):

    //einzelne Funktion:
    extern "C" void func(int);
    
    //mehrere Funktionen:
    extern "C" {
      void func1(int);
      int func2(int, double);
      ...
    }
    

Anmelden zum Antworten