C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[18342] Re:청년백서...제 1장...visual c++ dll 때려잡기!!!!
임양규 [] 6686 읽음    2002-05-10 10:05
안녕하세요??

저도 이문제 게시판에 질문도 하고 Q&A를 막 뒤지고, 각종 사이트를 뒤져도 해답이 없어서 몇달 동안 고생해서 포기하려고 하다가...BCBdev.com에 있는 문제를 정독하고 나서야 오늘 해결했습니다.

오늘 정말 기분 좋은 하루네요...

참고로 unresolved external 에러는 함수를 찾을 수 없는 경우에 발생한다고 문서에는 되어있네요..
즉, unresolved external _함수명 이런식으로 나왔을 것입니다. 여기에서 _함수명이 원래의 dll에는 언더바 없이 함수명으로 되어있습니다. 당연히, 함수가 없다고 나오겠죠...

따라서, 이를 해결하기 위해서 원래의 함수(_없는 함수)를 _함수(언더바 있는 함수로 빌더 커맨드라인 툴인 impdef와 implib를 이용해서 생성하면 됩니다.)

하여튼, 전 이 방법으로 성공했습니다.
다음의 절차를 따라서 해 보세요...

***DLL에 있는 linker의 이름을 확인해야 합니다.

예) dll파일의 이름이 mydll.dll일 경우
TDUMP -ee -m mydll.dll > mydll.lst

위의 방법으로 함수를 호출하는 convention을 확인해야합니다. 이에 따라서 다음 절차가 틀려집니다.
자세한거는 bcbdev.com의 문서를 확인하세요.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Case 1. Dll이 __stdcall만 사용할 경우
            사용 예) implib (dest lib file name) (source dll file)
                        예) implib mydll.lib mydll.dll
위와 같이 하여 생성된 lib를 프로젝트에 포함시킨 후 컴파일 하면 됩니다.

참고로 저는 이 경우가 아니라서 해 보지는 않았습니다만 case2 의 경우라서 성공했습니다.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

case 2. dll이 __cdecl만 사용할 경우(__stdcall이 mydll.lst에서 보이지 않으면 디폴트로 __cdecl이라고 하네요..)

이 경우, 문서에는 복잡하게 alias를 사용자가 지정하는 식으로 설명되어있지만, 실제로 헬프에서 impdef의 사용법을 찾으니 alias를 bcb가 자동으로 생성해 주네요...
       
        사용법) impdef로 dll에서 def 파일을 생성합니다. 이때 다음의 옵션(-a)는 꼭 주셔야 합니다. -h는 관계없는 듯합니다. -a를 해주지 않으면 말짱 도루묵입니다. 그 이유는 아래에 설명할께요..
         
           impdef -a dest def file  source.dll
        
            예) impdef -a my.def mydll.dll

이상과 같은 절차를 마치면, def파일을 에디터 등으로 오픈한 후, 확인해 봅시다.
아마도 함수명들이 _함수명 이런식으로 나왔던  바뀌어있을 것입니다.
만약에 impdef에서 -a 옵션을 주지 않으면, 함수명만 되어있으므로, 사용자가 직접 alias를 주기 위해서 def 파일을 편집해야 합니다.

자, 이제 마지막 단계입니다.

def 파일을 통해서 lib를 생성하는 단계입니다.

사용법) implib dest lib file  source def file

예) def파일의 이름이 my.def이고, 생성할 lib이름이 mydll.lib 일 경우

        implib mydll.lib my.def

위와 같이 에러 없이 lib가 생성되었으면 아마도 100% 성공...(ㅋㅋ..저의 경우입니다.)

만약에 의심스러우면 TLIB mydll.lib ,1.lst 로 함수이름을 확인해 봅시다.

아마도, _함수명 size=0 이런식으로 나와있을 겁니다.

이제, 생성된 lib 파일을 프로젝트에 add시키면됩니다.

참고로 dll은 반드시 프로젝트를 컴파일한 디렉토리에 위치시켜야합니다.

+ -

관련 글 리스트
18270 C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. choi 2519 2002/05/08
30028     Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. 하느리 2564 2002/05/08
30027     Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. 하느리 2467 2002/05/08
30026     Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. 하느리 2507 2002/05/08
18342     Re:청년백서...제 1장...visual c++ dll 때려잡기!!!! 임양규 6686 2002/05/10
18275     Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. 박세용 2806 2002/05/08
18279         Re:Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. 2851 2002/05/08
18283             Re:Re:Re:C++ Builder5.0에서 Visual C++을 위해 만들어놓은 LIB.DLL을 사용하고 싶습니다. swapper 3455 2002/05/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.