Funktionsname in dll anders als erwartet.



  • Hallo Leute,

    warum heißen die Funktionen in meiner dll so "komisch"?
    ZB: Funktion testabc heißt: ?testabc@@YAXHQAPAUmystruct_tag@@H0@Z
    Und wie kann ich es machen das da nur testabc?
    Ich habe MS VS C++ 6.0. Alles was ich gemacht habe war ein Standard dll Projekt das einige Symbole exportiert erstellt und dann meine Funktionen hereinkopiert. Muß irgendwo unter den Compileroptions sein. Aber wo?

    Viele Grüße

    Frederik





  • Hallo flenders,

    vielen Dank fuer den Link. Das mit __declspec(dllexport) usw. war mir in etwa schon klar.
    Wenn ich das Standard Projekt kompiliere heißen die Funktionen auch so komisch. Kann mir einer erklären was das ist?

    Es geht darum eine dll zu ersetzen. Wenn ich die dll analysieren lasse steht dort nur ein Name wie "myFunc", mehr nicht. Ich habe jetzt eine neue dll erstellt und die Funktion myFunc hereinkopiert. Analyisiere ich diese dll steht dort sowas wie oben. Das Projekt mit der ausgewechselten dll lässt sich auch nicht mehr starten. Ich vermute mal das liegt an den verschiedenen Namen in der dll.

    Viele Grüße

    Frederik

    PS: Hat es ev. etwas damit zu tun das das alte Projekt mit irgend einem alten C Compiler erstellt wurde?



  • Hallo Frederik,

    ich erinnere mich grau daran das man eine .def Datei einbinden musste.
    Mach mal eine Textdatei abc.def und schreib folgendes rein:
    EXPORT myFunc

    Wenn das nicht klappt habe ich mich in der Syntax vertan. Einfach mal nach .def, dll, export, c, c++ suchen lassen. Da müsstest Du einiges finden. Das Problem ist einigermassen bekannt und dokumentiert;-)

    Viele Grüße

    Peter



  • Hi,

    also wenn ich Funktionen aus einer DLL exportieren will, dann verwende ich immer:

    #define DLLEXPORT extern "C" __declspec (dllexport)
    
    DLLEXPORT int myFunc (...)
    

    Bei mir steht dann zwar immer noch ein "_" vor myFunc, aber das war's auch schon.

    Hast du das schon mal probiert? 😃



  • Hier noch eine Variante:

    /* Deine Header-datei */

    #ifndef _NAME_
    #define _NAME_
    
    #ifdef __cplusplus
    extern "C" {  
    #endif
    
    /* Damit man es nicht immer schreiben muss */
    #define CALL __declspec (dllexport)
    
    /* Hier stehen deine Prototypen usw. */
    CALL int myFunc ();
    
    #ifdef  __cplusplus
    }
    #endif
    
    #endif
    

    /* Deine Definitions-datei */

    LIBRARY		DLL_NAME
    
    DESCRIPTION	'xyz DLL W32 hastenichtgesehen'
    
    EXPORTS
    
                myFunc
    

    Damit deine *.def auch berücksichtigt wird fügst du noch folgendes in deinen Quellcode hinzu:

    #pragma comment(linker, "/DEF:dateiname.def")
    

    Viel Spass
    Sören



  • Hallo Euch allen,

    mit der .def Datei von Spontex hat es geklappt. Vielen Dank:-)

    Frederik



  • Spontex schrieb:

    /* Deine Header-datei */

    #ifndef _NAME_
    #define _NAME_
    

    Wer hat eigentlich damit angefangen? 😮
    Man darf niemals globale Bezeichner verwenden, die mit einem Unterstrich beginnnen. Die sind reserviert für die Compiler-Bauer.


Anmelden zum Antworten