2017-12-17 9 views
1

/*이 코드는 http://www.cplusplus.com/articles/48TbqMoL/에서 복사 한 것입니다. */GetProcAddress (HINSTANCE, LPCSTR)의 seconde 매개 변수가 함수 이름을 식별하지 않는 이유는 무엇입니까? 왜 뭔가 ("_Z6 * v")가 더 추가 되었습니까?

// * .dll 소스 코드에 선언 된 함수.

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

//로드 된 라이브러리 (temp 임)에서 함수를 가져 오기위한 코드. "_Z6getObjv"에서 "_Z6", "v"는 무엇입니까?

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/ –

답변

3

내 보낸 함수의 이름은 컴파일러마다 다릅니다 (자세한 내용은 name mangling 참조). (_Z*은 아마도 GCC v3 + 일 것입니다.)

일종의 플러그인 시스템을 구축하려면 고정 함수 이름을 가진 공용 ABI가 있어야합니다. .DEF file을 사용하여 내 보낸 이름을 제어 할 수 있습니다. 당신은 또한 당신의 기능이 실제로으로 수출하고있는 것을 볼 수 EXTERN_C __declspec(dllexport) int __cdecl MyFunc(long parm1) { return 0; }

사용 Dependency Walker와 unmangled 이름을 내보낼 수있는 Microsoft C/C++ 툴체인으로

.