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 durchp_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); ... }