- Visual C++ DLL과의 문제점
실제 세계에서는 Visual C++에서 만든 DLL을 호출하는 일이나 C++Builder에서 만든 DLL을 호출하는 것이나 비슷합니다.
불행하게도, Inprise와 Microsoft는 여러 가지 면에서 다르게 DLL을 구현하였습니다. 처음에 시작할 때 Inprise와
Microsoft는 OBJ에 대한 파일 포맷과 임포트 라이브러리 파일에 대한 포맷을 달리 하였습니다.Visual C++은 COFF 라이브러리를
사용하는 반면 Inprise는 OMF를 사용합니다. 이것이 의미하는 바는 C++Builder 프로젝트에 마이크로소프트에서 생성된 임포트
라이브러리를 추가할 수 없다는 것을 의미합니다.
다행스럽게도 Inprise는 IMPLIB 라는 유틸리티를 제공함으로써 포맷 형식이 다른
것을 극복할 수 있게 되었습니다.
2가지 제품 역시 링커 네이밍 규칙도 다릅니다. 이 현상은 C++Builder로부터 Visual C++ DLL을 호출할 때 가장 많이
나타나는 현상입니다.
DLL이나 OBJ 안에 모든 함수는 링커 이름을 가지고 있습니다. 이 링커는 컴파일 시 프로토타입화된 함수들을
해석할 수 있는 링커 이름들을 사용합니다. 이 링커는 프로그램에 의해 필요하다고 생각되는 링커 이름을 가진 함수를 찾지 못한다면
"unresolved external error"를 발생시키게 됩니다.
Visual C++ 와 C++Builder 의 네이밍 규칙
호출 규칙 | VC++ | VC++ (DEF) | C++Builder |
__stdcall | _MyFunction@4 | MyFunction | MyFunction |
__cdecl | MyFunction | MyFunction | _MyFunction |
경우 1: DLL이 오직 __stdcall 함수들만 포함하고 있고 DLL 벤더가 DEF 파일을 사용할 경우.
IMPLIB는 다음과 같이 사용합니다:
- IMPLIB (목적 lib 이름) (소스 dll)
-
IMPLIB mydll.lib mydll.dll
경우 2: DLL이 __cdecl 함수를 포함하고 있거나 장식된 이름의 __stdcall 함수를 사용하는 경우.
이 경우 IMPDEF 유틸리티를 다음과 같이 사용하여 DEF 파일을 만듭니다:
- IMPDEF (목적 DEF 파일) (소스 DLL 파일).
-
IMPDEF mydll.def mydll.dll
-
LIBRARY DLL.DLL
EXPORTS
- CdeclFunction @1
UnknownFunction @3
_StdCallFunction@4 =_StdCallFunction @2
-
EXPORTS
-
알리아스 타입 변경
(Borland 이름)= (Visual C++에 의해 노출되는 이름)
_CdeclFunction = CdeclFunction
_UnknownFunction = UnknownFunction
StdCallFunction = _StdCallFunction@4
-
IMPLIB (목적 lib 파일) (소스 def 파일)
-
IMPLIB mydll.lib mydll.def
2)DLL이 싫으면, 아예 OCX로 구현하면 됩니다. 이렇게 하면 Delphi와 C++Builder에서 구현할 수 있습니다.
볼포에서 발췌...
'1.소프트웨어 이야기 > 00.VCL(C++ Builder, Delphi)' 카테고리의 다른 글
AnsiString 클래스(메소드 정리) (0) | 2009.04.21 |
---|---|
DLL의 호출자 알아내기.. (0) | 2009.03.19 |
DLL 만들시 자동으로 Import, Export 처리자 처리하기. (0) | 2009.03.19 |