DLL selbstgemacht



  • Hi, ich hab grad meine erste DLL erzeugt.
    dll.h

    __declspec(dllexport) void tstfunc (void);
    __declspec(dllexport) void print_hello (void);
    

    dll.cpp

    #include "dll.h"
    #include <iostream.h>
    void tstfunc (){}
    void print_hello (){std::cout <<"Hello World!\n";}
    

    Klappt ja auch alles. Nun mal mit nem DLL-Viewer "reingeschaut", da steht nun

    Entry Point   Ord   Name
    654012D0h     1     _Z7tstfuncv
    654012D6h     2     _Z1print_hellov
    

    Was bedeutet nun das "_Z7", "_Z1" ? Und weshalb ist da ein "v" an den namen gefügt ? Steht das für die Parameter (void) ?

    Und was bedeuten diese furchtbaren Konstruktionen, die man in anderen Headern zu dll's sieht?

    Auszug aus glaux.h

    typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
    

    Vielen Dank.



  • Du arbeitest mit C++ die Buchstabencombination davor oder dahinter hat etwas mit dem name mangling zu tun. Soll deine dll in Windows eingesetzt werden solltest du in der Header Datei die Funktionsprototypen in

    #if defined(__cplusplus)
    extern "C"{
    #endif
    
    Funktionsprototypen
    
    #if defined(__cplusplus)
    }
    #endif
    

    einschließen. Sonst kannst du nicht von anderen Compilern und Sprachen auf diese dll zugreifen.



  • yusha schrieb:

    Und was bedeuten diese furchtbaren Konstruktionen, die man in anderen Headern zu dll's sieht?
    Auszug aus glaux.h

    typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
    

    dieser typedef definiert einen function pointer. APIENTRY müsste sowas wie __stdcall sein. PFNGLSAMPLEMASKEXTPROC heist wahrscheinlich 'pointer to function of type sample mask extended procedure'. das schimpft sich 'ungarische notation (das PFN zumindest) und ist eine archaische windows-unsitte.



  • Das kann wohl sagen. Was ist der Grund ? Wollten die unbedingt die Unterstriche einsparen oder es einfach nur mysteriös aussehen lassen ?



  • die wollen einfach nur besonders cool sein, wie die leute aus diesem thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-114503-and-highlight-is-.html



  • @net bist cooooooooooooool drauf 🙂



  • yusha schrieb:

    Das kann wohl sagen. Was ist der Grund ? Wollten die unbedingt die Unterstriche einsparen oder es einfach nur mysteriös aussehen lassen ?

    Der Grund für diese "Dekorationen" der Symbole in den .obj Files ist die Sprache C++ selbst. Da in C++ für die gleiche Funktion mehrere Überladungen existieren können musste ein Weg gefunden werden die Symbole in den .obj Files eindeutig zu machen, damit der Linker sie richtig zuordnen kann. Im Prinzip werden in den Funktionsnamen Parameter und Rückgabewert eincodiert.
    Unglücklicherweise gibt es dazu keinen Standard, was dazu führt dass Objectfiles die von verschiedenen Compilern generiert werden zueinander nicht kompatibel sind obwohl sie oft das gleiche Objectfile-Format( COFF, ELF ... ) verwenden.
    Kurt


Anmelden zum Antworten