[완료] LoadLibrary에 관련한 질문입니다

tommybee의 이미지

안녕하세요
제가 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를 떼어낼수 없다면 왜 저런식으로 붙어 있는 건지도 궁금하구요
모든 것이 궁금합니다
고수님들의 조언 부탁드립니다

SoulreaveR의 이미지

dynamic linking library의 경우, 링커가 심볼 해결하는 과정에서 지정된 library를 뒤져서, 앞으로 써야 되는 함수의 경우 어느 dll을 참조해서 찾아야 하는지를 명시하고, object 파일에 plt를 만들어 놓습니다. 그리고 실제 실행될 때 dll의 함수 주소를 plt에 기록하고(got인가요? -_-;) 참조하게 됩니다. 뒤에 붙은 @4는 아마도 dll중 4를 참조하라는 뜻인거 같은데, 정확하게는 모르겠네요. 정적 링크를 하게 되면 @4 라는 걸 보지 않을 수 있습니다. (dll을 쓸 일이 없어지니깐요)

내용이 뭔가 많이 틀린 거 같은데, 고수님들의 태클을 부탁드립니다;

cppig1995의 이미지

C++ mangling이랑 관련된 것 같습니다.
자세한 건 고수님들께 패스...

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

okdongil의 이미지

저는 고수는 아니구요.
DLL Export할 함수를

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
dll 함수들...
#ifdef __cplusplus
};
#endif /* __cplusplus */
로 묶어 주세요.
extern "C"는 C++ Compiler에게 mangling을 하지 않겠다고 알려줍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.