2017-12-17 1 views
1

/* Dies ist ein Teil des Codes, der von http://www.cplusplus.com/articles/48TbqMoL/ kopiert wurde. */Warum nicht der seconde Parameter von GetProcAddress (HINSTANCE, LPCSTR) identifiziert die Funktionsnamen? Warum wird etwas ("_Z6 * v") hinzugefügt?

// Die im * .dll-Quellcode deklarierten Funktionen.

DLLAPI std::unique_ptr<Base> getObj(void); 
DLLAPI std::string getName(void); 

// Der Code zum Importieren von Funktionen aus der geladenen Bibliothek (mit dem Namen temp). Was ist "_Z6", "v" in "_Z6getObjv"?

typedef std::unique_ptr<Base> (__cdecl *ObjProc)(void); 
typedef std::string (__cdecl *NameProc)(void); 

ObjProc objFunc = (ObjProc)GetProcAddress(temp, "_Z6getObjv"); 
NameProc nameFunc = (NameProc)GetProcAddress(temp, "_Z7getNamev"); 
+0

https://demangler.com/ –

Antwort

3

Wie die exportierten Funktionen genannt werden, ist spezifischer Compiler, um weitere Informationen zu name mangling sehen. (_Z* ist wahrscheinlich GCC v3 +)

Wenn Sie eine Art Plug-in-System erstellen, sollten Sie eine öffentliche ABI mit festen Funktionsnamen haben. Sie können eine .DEF file verwenden die exportierten Namen zu steuern.

Mit dem Microsoft C/C++ Toolchain Sie auch unmangled Namen mit EXTERN_C __declspec(dllexport) int __cdecl MyFunc(long parm1) { return 0; }

Verwenden Dependency Walker als zu sehen, was tatsächlich Ihre Funktionen werden exportiert exportieren.

Verwandte Themen