1. Dll 파일을 만들때는 가급적 __cdecl  형식으로 컴파일 해야 된다.

 

   __cdecl 은 컴파일시 함수의 이름이 바뀌는 naming 규칙 중 하나로써, __stdcall 및 __fastcall 도 있다.

 

 

  만약,  LoadLibrary 계열의 함수를 사용할 경우 __cdecl 이라는 형식으로 컴파일이 되어 있지 않은 경우

  GetProcAddress() 함수에서 찾아낼 함수의 이름을 다르게 해줘야 한다.

 

  예를들어 작성한 함수의 이름이 test() 이라고 한다면

 

  __cdecl 은 test

  __stdcall 은 _test@숫자

  __fastcall 은 @test@숫자

 

  이렇게 저장되어 있을 것이다. 

 

  따라서 GetProcAddress 에서 __cdecl 사용시에는 "test" 라고 호출하면 되지만

  __stdcall 에서는 "_test@숫자" 이렇게 바뀐 함수명을 호출해야 제대로 검색 할 것이다.

 

 

  반면에 LoadLibrary 함수를 사용하지 않고 "foo.lib" 파일을 사용해서 컴파일시 linking 을 한다면

  반드시 __cdecl 형식으로 해야 한다.  그래야 linking 시 함수명을 제대로 찾아서 올바르게 linking 할 수 있기 때문이다.

 

  p.s. : exe 파일이나 dll 및 lib 파일에서 만들어진 외부에 연결되도록 한 함수명을 보고 싶으면 "dumpbin /exports" 를 사용하고

          자기가 사용하는 함수명을 보고 싶으면 "dumpbin /import!s" 를 하면 된다.

 

  p.s. : 일반 cmd 창을 띄우면 dumpbin 명령이 안 먹힐 것이다.  이는 Visual Studio Command Prompt 로 만들어진 cmd 창에서

          실행시켜야 한다.



[출처 : http://blog.daum.net/artofprogramming/4526245]

+ Recent posts