Zugirff/Namensauflösung von Variablen und Funktionen in DLL



  • Hallo,

    ich habe ein tutorial gesehen, mit einer dll und folgendem DLL Code

    __declspec(dllexport) int f;
    __declspec(dllexport) void OutputBox()
    {
     ShowMessage(f);
    }
    

    und nun der dynamische aufruf:

    void __fastcall TForm2::dButtonClick(TObject *Sender)
    {
    typedef int Tf;
    typedef void TOutputBox();
    Tf* f;
    TOutputBox* outputBox;
    
    HINSTANCE h = LoadLibrary("var.dll");
    if(h!=0)
       {
        f = (Tf*)GetProcAddress(h,"_f");
        outputBox = (TOutputBox*)GetProcAddress(h,"@OutputBox$qv");
       }
     if((f!=NULL)&&(outputBox!=NULL))
        {
         *f = StrToInt(dEdit->Text);
         outputBox();
        }
    }
    

    wieso bei GetProcAdress einmal "_f" und bei der Funktion dieses "@OutputBox$qv"??

    Ist dies immer so?wenn ja, woher weiß ich das denn??

    danke schonmal



  • Hallo

    der Unterstrich wird vom Compiler der DLL für den Funktionsnamen verwendet, wenn die Funktion als "extern C" exportiert wird. Das ist normal und üblich.

    bis bald
    akari



  • aber die variable f wurde nicht als extern "C" exportiert!
    und auch die Funktion OutputBox() nicht, wieso wird diese so "kryptisch" aufgerufen?



  • Dies ist das sogenannte C++ name mangling (d.h. die Parameter der Funktion sind im Namen mitcodiert - selbst bei einer Funktion mit keinen (void) Parametern).

    Wenn du die DLL-Funktionen als extern "C" deklarierst, dann kannst du die einfachen Namen mit vorangestelltem "_" nutzen, z.b. "_OutputBox".


Anmelden zum Antworten