C++ Builder XE 에서 CPort 4.1 사용하기.

2012. 1. 26. 10:25언어/C++ Builder

CPort는 델파이 XE까지 지원하지만 C++ Builder에서는 6.0까지밖에 지원하지 않습니다.

몇가지 시도 끝에 C++ Builder XE에서 사용할 수 있게 되었습니다. 

 - 순서 - 
1. http://sourceforge.net/projects/comport/files/comport/4.11/  해당 사이트로 가서 4.11 버전을 다운받는다. 참고로 저는 4.11f버전을 다운받았습니다.

2. 압축을 풀어주고 C++ Builder가 아닌 Embarcadero RAD Studio를 실행합니다. C++ Builder XE를 실행하지 않는 이유는 프로젝트 파일이 델파이 파일이라 C++ Builder에서는 열리지 않기 때문입니다.

3. RAD를 실행했으면 File - Open Project를 클릭하여 압축을 푼 디렉토리안에 Source에서 CPortLibDXE 파일을 Open합니다.(Tools-Option에서 C++ Options - Package output Directory의 경로를 변경해주어도 됩니다. 참고로 저는 변경하지 않았습니다. 이 경로는 나중에 BPL링크를 걸어줄 때 필요합니다.)

4. Project-Option에서 Output-C/C++ 트리메뉴를 클릭하여 C/C++ Output file generation을 보시면 Generate DCUs only되어 있는 것을 볼 수 있습니다. 이것을  Generate all C++ Builder file(including package libs)로 변경하여 주고 컴파일을 합니다.

5. 컴파일을 했으면 프로젝트를 닫고 file-Open Project를 하여  DsgnCPortDXE를 Open하고 4번을 똑같이 해 줍니다. 3번의 경로 변경을 해 주셨다면 이것도 같이 변경 하여 줍니다.

6. 컴파일 & 인스톨을 해 줍니다.

7. 새 프로젝트를 만들고 tool Palette에서 CPortLib트리메뉴가 있는지 확인합니다. 있으면 설치는 완료 된 것입니다.

8. TComport를 올리고 컴파일을 하면 오류가 나올 것입니다. (안나온다면 전 왜 나온거죠?;;) CPort.hpp파일에서 오류가 날 것이라고 믿습니다. 오류는 EComPort함수가 중복선언 되어 있다고 나오는 것과 이미 선언되어 있다고 나오는 것 두가지입니다. 파일을 열어보면  

class DELPHICLASS EComPort;
class PASCALIMPLEMENTATION EComPort : public Sysutils::Exception
{
typedef Sysutils::Exception inherited;

private:
int FWinCode;
int FCode;
public:
__fastcall EComPort(int ACode, int AWinCode);
__fastcall EComPort(int ACode);
__property int WinCode = {read=FWinCode, write=FWinCode, nodefault};
__property int Code = {read=FCode, write=FCode, nodefault};
public:
/* Exception.CreateFmt */ inline __fastcall EComPort(const System::UnicodeString Msg, System::TVarRec const *Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { }
/* Exception.CreateRes */ //inline __fastcall EComPort(int Ident)/* overload */ : Sysutils::Exception(Ident) { }
/* Exception.CreateResFmt */ inline __fastcall EComPort(int Ident, System::TVarRec const *Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { }
/* Exception.CreateHelp */ inline __fastcall EComPort(const System::UnicodeString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { }
/* Exception.CreateFmtHelp */ inline __fastcall EComPort(const System::UnicodeString Msg, System::TVarRec const *Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { }
/* Exception.CreateResHelp *///inline __fastcall EComPort(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { }
/* Exception.CreateResFmtHelp */ inline __fastcall EComPort(System::PResStringRec ResStringRec, System::TVarRec const *Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { }
/* Exception.Destroy */ inline __fastcall virtual ~EComPort(void) { }
};

위와 같이 선언되어 있습니다.  빨간색 글씨로 되어 있는 부분을 주석 처리 하면 정상적으로 컴파일 됩니다. 또는 보라색 부분을 주석처리 해도 컴파일은 됩니다. 
저도 여기서 의문점인게 빨간색과 보라색 둘중 하나가 없더라도 나중에 코딩할때 문제가 되지 않는지에 대한 점입니다. 이건 좀더 찾아봐야 할 것 같습니다. 어쨌건 이렇게 하면 CPort 4.1 설치는 완료되어지게 됩니다.

--- 추가 ---

http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=66066 
제가 자주 들어가는 포럼에서 문의 한 결과 inline 함수는 주석처리해도 실행하는데 있어 크게 상관 없다고 합니다. 답변해주신 빌더님께 다시한번 감사인사 드립니다. 고로 빨간색만 주석처리 하고 사용하시면 될 것 같습니다.

--- 추가 ---

 CPort.hpp에 아래와 같이 코드를 입력해 주면 된다.
?

1
2
3
4
5
#ifdef UNICODE
#define SetPortW SetPort
#else
#define SetPortA SetPort
#endif