[완료] LoadLibrary에 관련한 질문입니다
안녕하세요
제가 dll을 하나 임포트 하여서 그안에 함수를 쓸려고 했습니다
근데 문제가 하나 생겼는 데요
큰문제는 아닙니다 만...
처음에 dll값을 받아 왔을때는 아무 이상없이 나오는 데 함수의 포인터를 가지고 오지 못하길래
dumpbin으로 확인해 보았더니
_FSOUND_Sample_GetMode@4처럼 뒤에 @4같은 문자가 붙어 있었습니다
물론 받은 헤더 파일에는 그렇게 되어 있진 않구요
그러면 저는 항상 위에 같은 식으로 함수를 GetProcess로 가져와야 하는 것인지요?
아니면 어떻게 해결 할 수 있는 방법이 있는 건지 갑자기 궁금해졌습니다
제가 쓴 부분에 헤더는 아래와 같이 정의되어 있었구요
DLL_API signed char F_API FSOUND_IsPlaying(int channel);
dll은 "fmod.dll"이라는 이름이었습니다
그래서
signed char (__stdcall *FSOUND_IsPlaying2)(int channel);
라고 정의하고
로직에서 LoadLibrary("fmod.dll")하고 나서
FSOUND_IsPlaying2=(signed char (__stdcall *)(int))GetProcAddress(dllHandle,"_FSOUND_IsPlaying@4");
라고 해주었습니다
만약 @4를 떼어낼수 없다면 왜 저런식으로 붙어 있는 건지도 궁금하구요
모든 것이 궁금합니다
고수님들의 조언 부탁드립니다
PE format은 잘 모르겠지만........
dynamic linking library의 경우, 링커가 심볼 해결하는 과정에서 지정된 library를 뒤져서, 앞으로 써야 되는 함수의 경우 어느 dll을 참조해서 찾아야 하는지를 명시하고, object 파일에 plt를 만들어 놓습니다. 그리고 실제 실행될 때 dll의 함수 주소를 plt에 기록하고(got인가요? -_-;) 참조하게 됩니다. 뒤에 붙은 @4는 아마도 dll중 4를 참조하라는 뜻인거 같은데, 정확하게는 모르겠네요. 정적 링크를 하게 되면 @4 라는 걸 보지 않을 수 있습니다. (dll을 쓸 일이 없어지니깐요)
내용이 뭔가 많이 틀린 거 같은데, 고수님들의 태클을 부탁드립니다;
C++ mangling이랑 관련된
C++ mangling이랑 관련된 것 같습니다.
자세한 건 고수님들께 패스...
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
저는 고수는
저는 고수는 아니구요.
DLL Export할 함수를
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
dll 함수들...
#ifdef __cplusplus
};
#endif /* __cplusplus */
로 묶어 주세요.
extern "C"는 C++ Compiler에게 mangling을 하지 않겠다고 알려줍니다.
댓글 달기