Win32 , C++

Delphi 어플리케이션에 사용할 VC 만들기/사용하기

김모작자 2007. 1. 13. 19:04
DLL 만드는 기초

우선 아래에 대해 이해를 해야한다
1) C++컴파일러의 특성
2) 인터페이스 규칙
3) 헤더 만들기

1. 다른 제품간의 C++ 호환성
컴파일러에 의해 생성되는 .obj/.lib 파일 출력에서 OMF, COFF 형식의 차이가 발생한다
이는 C++ 컴파일러에 의해 함수명 앞뒤로 전달 인자에 대한 정보가 붙기 때문이다.

예를 들어 Microsoft C++ 컴파일러는
int CPUReset(void *)
를 별도의 설정이나 명시된게 없을 경우
?CPUReset@@YAHPAX@Z
이런 이름으로 내보내게 된다.

문제는 앞뒤에 달라 붙는 정보가 컴파일러 제조사/규격 마다 다르기 때문에 호환이 되지 않게 된다. 따라서 이기종 컴파일러와 인터페이스를 하기 위해선 앞뒤에 정보가 빠진 함수 본래 이름만 내보내도록 해야한다

2. 인터페이스 규칙 (Calling Conventions)
이 부분은 공통적인 사실상의 표준이 있기 때문에.. 편리하거나 혹은 양쪽이 지원하는 방법을 택하도록 한다. 현재 많이 쓰는 규칙으로는 cdecl, stdcall, pascal 등이 존재한다.
기본 설정이 있지만 프로젝트마다 다를 수 있기 때문에 소스상에 규칙을 정확하게 명시하는게 좋다.

3. 헤더 만들기
Borland C++ Builder, Delphi 등 에서 사용하기 위해서 중요한 작업으로 인터페이스 규칙, 전달 인자 등의 구체적인 기록 작업이다.
같은 데이터 타입이라도 Call by value/reference/pointer 에 따라 세부적인 데이터 형태가 바뀔 수 있다

Delphi 예:
 function CPUReset(handle : longword):longword;stdcall; external 'dllfile.dll';
기타 C 컴파일러 호환:
 Borland C++ 쪽은 일단 Explicit loading 으로 해결하는 것 밖에 모르겠다.