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
    그리고 프로젝트에 바로 mydll.lib를 첨가하기만 하면 됩니다.

    경우 2: DLL이 __cdecl 함수를 포함하고 있거나 장식된 이름의 __stdcall 함수를 사용하는 경우.

    이 경우 IMPDEF 유틸리티를 다음과 같이 사용하여 DEF 파일을 만듭니다:

      IMPDEF (목적 DEF 파일) (소스 DLL 파일).
    예를 들면,
      IMPDEF mydll.def mydll.dll
    IMPDEF를 실행시킨 후에, DEF 파일을 열어봅니다. Visual C++로 컴파일된 DLL일 경우 위의 명령어로 생성되는 DEF파일의 형태는 다음과 같을 것입니다:
      LIBRARY   DLL.DLL

      EXPORTS

        CdeclFunction       @1
        UnknownFunction     @3
        _StdCallFunction@4  =_StdCallFunction      @2
    다음 단계는 C++Builder가 인식할 수 있는 DLL 함수 이름으로 알리아스를 변경하는 일입니다. 다음의 예가 이 DEF 파일을 적절히 변경한 예입니다.
      EXPORTS
        알리아스 타입 변경
        (Borland 이름)= (Visual C++에 의해 노출되는 이름)
        _CdeclFunction  = CdeclFunction
        _UnknownFunction = UnknownFunction
        StdCallFunction = _StdCallFunction@4
    마지막 단계는 알리아스화된 DEF 파일로부터 알리아스화된 임포트 라이브러리를 만드는 일입니다. 다음의 형태를 따라야 합니다. 이 경우 DLL을 사용하는 것이 아니라 DEF 파일을 사용한다는 점에 주의합시다.
      IMPLIB (목적 lib 파일) (소스 def 파일)
    예를 들면,
      IMPLIB mydll.lib mydll.def
    임포트 라이브러리가 생성되었다면 mydll.lib를 첨가하면 됩니다.

    2)DLL이 싫으면, 아예 OCX로 구현하면 됩니다. 이렇게 하면 Delphi와 C++Builder에서 구현할 수 있습니다. 

    볼포에서 발췌...

+ Recent posts