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".