이 기술 자료는 AL MANNARINO가 게시한 자료를 번역해 정리해 놓은 것입니다.

https://community.embarcadero.com/blogs/entry/migrating-legacy-c-builder-apps-to-c-builder-10-seattle

 

C ++ 빌더는 다양한 산업 분야에서 선호도 높게 사용되는 툴로서, 프로젝트에 종사하는 수백만 명의 전문 프로그래머들이 사용합니다.

 

저희는 종종 오래된 C ++ 빌더 코드를 현재 C ++ 빌더 버전으로 마이그레이션하는 것을 도와 줄 것을 요청받곤합니다.

아래 나용이 여러분의 마이그레이션 작업에  도움이 되길 바랍니다.

 

다음은 C ++ 빌더 마이그레이션을 돕기위한 몇 가지 팁과 방법들입니다. 

 

이 팁을 사용했던 고객들은 약 60,000 줄의 코드로 되어있는 프로젝트를 변환하는 데 하루 이상 걸리지 않았다고 보고했습니다.

 

주제는 다음과 같습니다.

  • 마이그레이션 고려 사항 - 유니 코드
  • 이전 버전 C ++ 빌더를 C ++ 빌더 10으로 마이그레이션하기위한 팁
  • 엠바카데로 C ++ 빌더 애플리케이션을 유니 코드로 포팅하기위한 팁
  • 이전 버전 C ++ 빌더 마이그레이션을위한 추가 리소스

 

마이그레이션 고려 사항 - 유니 코드

대부분의 경우 이전 C ++ 빌더 소스 코드와 폼들은 현재 C ++ 빌더 10 시애틀에서 열기, 컴파일, 링크 및 실행되지만

경우에 따라서 유니 코드를 변경하고 써드-파티 라이브러리를 다시 빌드해야 하는 경우도 있습니다.

 

      1.  이전 버전의 C ++ 빌더로 빌드 된 라이브러리는 C ++ 빌더 10 시애틀 프로젝트에서 사용하기 위해 다시

           컴파일해야합니다. 일반적으로 사용중인 타사 패키지/컴포넌트들은 C ++ 빌더 10 시애틀로 먼저 업그레이드되었는지, 

           코드에서 포인터/정수 바이트 크기 대한 문제는 없는지 VCL과 상호 작용하는 모든 문자열이 유니코드 준비가 되었는지

           등등을 확인해야합니다. 

 

      2.  C ++ 빌더 2007부터 C ++ 빌더는 유니 코드를 지원합니다. 즉, String이 AnsiString으로 대체 된 것처럼 

           String 및 Chars를 사용하는 방법에 따라 소스코드에 유니 코드 변환을 해야 할 수도 있습니다 . 몇 가지 예 :

C++ 마이그레이션 1.png

 

 

 

 

 

 

     

 

        3. 새로운 C++ 빌더는 C++ 표준을 준수하므로 어떠한 변경부분들은 Variants,TDateTime, Cardinal 타입들과

           관련 모호한 부분들이 있을 수 있어 이러한 타입간에 변환/타입케스트가 어덯게 발생하는지에 대해 설명합니다.    

           오래된 C++ 빌더 컴파일러가 C++ 표준에서 허용하지 않는 방식으로 임시 파일을  생성하고 이용하는데 사용되는

           경우도 있습니다.

이전 버전 C ++ 빌더를 C ++ 빌더 10으로 마이그레이션하기위한 팁

     1.  C ++ 빌더 10 시애틀에서 이전 C++ 빌더 프로젝트를 직접 변환하지 마십시오. 파일들을 새 폴더에 복사 해 놓고

         새로운 프로젝트를  생성하고 그 프로젝트에 소스 파일들을 추가하십시오. 처음에는 조금 더 노력이 필요한듯 하지만

         결국에는 많은 시간을 절약 할 수 있습니다.

 

     2.  Ansi Char에서 UnicodeString로 변환이 필요할 수 있습니다. 

 

        char * 형식의 매개변수(예 : Application-> MessageBox)를 사용하는 모든 VCL 함수에는 이제 wchar_t *

        대체합니다.  

        AnsiString을 반환하는 VCL 오브젝트 속성은 이제 UnicodeString을 반환합니다 (예 : Label-> Caption).

 

       매개변수가 문자열 상수이면 문자 앞에 L을 붙입니다. 변수전달 방식(Call By Value)을 사용했다면 더 어렵습니다.

       코드에서 String 타입을 사용하는 경우 이제 UnicodeString에 매핑되고 더 이상 AnsiString로 매핑되지 않습니다.

       UnicodeString.c_str()wchar_t *을 반환하고 AnsiString.c_str()은 여전히 char *을 반환합니다.

 

       String을 모두 AnsiString로 대체하지 마십시오. 대신 아래의 두 함수를 정의하십시오.

 

C++ 마이그레이션 2.png

          char * 타입을 입력 매개변수로 사용하고 wchar_t * 을 리턴하거나 매개변수와 리턴값이 반대인 경우에 이들을

          사용하십시오.    

          주의 :이 기능을 사용하기 편리하게 만드는 기능, 즉 정적 버퍼는 원하지 않는 동작을 유발할 수 있습니다.

          AnsiOf / UnicodeOf AnsiOf / UnicodeOf를 호출 할 수있는 함수의 인자로 호출되지 않았는지 또는

          AnsiOf / UnicodeOf가 동일한 함수의 두 개 이상의 인자로 사용되지 않는지 확인하십시오.

 

          또는 RTL에서 변환을 처리합니다. UnicodeStringAnsiString을 할당 할 수 있으며 
          그 반대의 경우( AnsiString UnicodeString을 할당)에도 RTL이 필요에 따라 변환합니다.
 

      3.  해당되는 경우 "AnsiOf"또는 "UnicodeOf" 함수 호출을 추가하여 프로젝트를 컴파일하고

          타입 오류를 해결합니다. 오류가 없을때까지 프로젝트를 계속 컴파일 하십시오.

 

      4.  모든 sprintf, fwrite 등을 사용하는 곳을 검색하십시오. 이러한 함수들은 매개변수 일부가 모든 변수 타입을

          허용하므로 컴파일러에서 오류메세지가 나타나지  않을 수도 있습니다. 

          AnsiOf 함수 호출을 해야하는지 수동으로 확인하십시오. 또는 필요에 따라 %s 대신 %S를 사용하도록

          포맷 지정자를 업데이트하십시오.

 

      5.  최적화 : AnsiOfUnicodeOf의 중복 사용을 제거합니다.

 

          예를 들어 fopen(AnsiOf(... 를 _wfopen(... 로 쉽게 대체 할 수 있습니다. 또한 fnsplit(AnsiOf_wfnsplit(...로

          비교적 쉽게 대체 할 수 있습니다.

 

          다른 매개변수도 wchar_t로 정의해야하며, 그로 인한 너무 많은 파급 효과는 발생하지는 않습니다. 

          또한 sscanf(UnicodeOf(...를  swscanf(...로 대체 해야합니다.

 

          변수 중 일부를 char에서 wchar_t로 변환하는 것이 가장 바람직합니다. strcpy 등의 문자열 함수를 사용했다면

          대부분의 경우 strwcs로 대체해야합니다.

 

         strcpy 함수를 사용 할 수 있는 버전에서 strncpy(s1, s2, sizeof(s1) -1)를 사용했다면 wchar_t의 배열 크기가 문자를

         2배로 확보할 수 있기때문에 wcsncpy(s1, s2, sizeof (s1) / 2-1) 로 대체합니다.

 

     6.  TColorGrid와 같은 일부 VCL 컴포넌트를 더 이상 사용할 수 없으므로 해결 방법을 찾아야합니다.

 

     7.  컴파일러가 일부 함수나 오브젝트 속성이 더 이상 사용 할 수 없다고  알려줄 것입니다.

         그러한 오류들도 수정하셔야 합니다. 

 

 

엠바카데로 C ++ 빌더 애플리케이션을 유니 코드로 포팅하기 위한 팁

 

     1.  응용 프로그램의 프로젝트 설정 _TCHARwchar_t로 매핑하십시오. 새 응용 프로그램에 대한 기본 설정은

         사용자가 지정 할 수 있습니다 디폴트로 char로 설정됩니다.

 

     2.  검색을 먼저 수행하고 교체하면서 시작하십시오. 예를들면 :AnsiString의 모든 인스턴스를  UnicodeString로

          AnsiCompare, AnsiPos, AnsiCompareIC의 모든 인스턴스를 각각 Compare, Pos, CompareIC로 대체합니다.

 

     3.  모든 문자를 자동으로 wchar_t로 변경하지 마십시오. 먼저 각 파일을보고 변경 사항이 올바른지 확인하십시오.

         AnsiString을 사용하기위한 코드를 작성하지 않았다면 변경사항에 특별한주의가 필요한 부분이 있습니다.

 
     4.  문자열 상수에 L (즉, L"Hello World") 접두어를 붙이거나 _T() 매크로를 사용하는 것이 좋습니다.
         (예 : _T( "Hello World")). 이렇게하면 응용 프로그램이 런타임 시에 문자열 상수를 유니 코드로 변환 할
         필요가 없습니다.

 

     5.  먼저 문자열(Strings) 타입에 대해서 살펴보도록 하겠습니다:

 

         AnsiString - 시스템 디폴트인 ANSI 코드 페이지를 기반으로하는 문자열입니다.  유니 코드를 완전히 사용하려면

         이 옵션(AnsiString)을 사용하지 마십시오.일부 라이브러리가 유니 코드가 아닌 경우 해당 라이브러리 함수를

         호출 할 때 이 코드를 사용해야 할 수도 있습니다.

 

         UnicodeString -이 문자열을 내부 저장, 특히 문자열을 VCL 또는 Windows API에 전달하려는 경우

         항상 사용하십시오. 

 

         UTF8String - AnsiString보다 좋습니다. UnicodeString을 UTF8String으로 변환 할 때 데이터 손실 가능성은 없습니다

         데이터를 저장하기 위해 8 비트 문자열이 필요하다면 AnsiString을 보다 UTF8String을 사용하는 것을 고려하십시오.

 

         ASCIIString (일명 AnsiStringT <20127>) - 원하는 일반 텍스트 데이터와 받는 쪽이 국제 문자를 허용하는지 또는

         어떤 코드 페이지가 지원 될지 알 수없는 경우 편리한 문자열입니다.

         이 타입 문자열에 유니 코드 또는 ANSI 문자열을 할당하면 많은 국제 문자에서 이 문자열을 제거하고

         영어 알파벳으로 변환합니다.몇 가지 경우는 편리하지만 맵핑되지 않은 문자는 물음표로 변합니다.

 

     6.  일반적인 질문 : TStrings, TOpenDialog.FileNam 등을 UnicodeString 대신 AnsiString으로 가져 오는

         메커니즘이 있습니까? 

         구 버전의 C ++ 빌더에서 C ++ 빌더 10 시애틀로 마이그레이션 해야하는 경우 소스코드 양이 많고,

         프로그램이 영어만 사용하고 있기 때문에 모든 것을 적용시키는 빠른 방법을 찾고있습니다.

         이러한 응용 프로그램의 대부분은 이전 FILE (fopen, fread,fwrite)들을 사용합니다. 

 

         대답:

 

         RTL이 변환을 처리하도록 합니다. UnicodeStringAnsiString을 할당 할 수 있으며

         그 반대의 경우(AnsiString UnicodeString을 할당)에도 RTL이 필요에 따라 변환합니다.

 

         sprintf, fopen, fread, fwrite 등의 모든 항목을 검색하십시오. 이 함수들의 매개변수들 중 일부는 모든 변수 타입을

         허용 하므로 컴파일러에서 오류 메세지가 표시되지 않을 수도 있습니다. AnsiOf 호출을 추가해야 하는지 수동으로

         확인하십시오. 또는 필요에 따라 %s 대신 %S를 사용하도록 포맷 지정자를 업데이트하십시오.

 

이전 버전 C ++ 빌더 마이그레이션을위한 추가 리소스

  Unicode Migration Resources for Delphi, C++Builder and RAD Studio >


  C++ Builder and Migration to Unicode

  C++ Specifics Index 

  Features that distinguish RAD Studio C++, such as descriptions of the C++0x features  supported in C++Builder >

  Recommendations on working with UnicodeString in C++ >

  Unicode for C++ Index >

  Enabling C++ Applications for Unicode >

  Unicode in RAD Studio >

  _TCHAR Mapping >

  Floating Functions >

  UTF-8 Conversion Routines >

  Directories and Conditionals >

  Cheat Sheet: Unicode-enabling Microsoft C/C++ Source Code
 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 22445
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 20970
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23043
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28820
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30017
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25369
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46311
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182141
» 이전 버전 C ++ 빌더 애플리케이션을 C ++ 빌더 10 시애틀로 마이그레이션 [1] file 김원경 2017.11.24 1706
5 개발자가 고민하는 마이그레이션 논쟁 해소를 위한 7가지 핵심 방안 관리자 2018.02.19 1428
4 델파이 애플리케이션 현대화 방안 관리자 2018.12.18 1199
3 [마이그레이션 사례] 워프비전(64-bit 애플리케이션) 험프리 2019.05.24 1023
2 [마이그레이션][팁] 배치파일(커맨드 명령어)을 이용해 손쉽게 소스파일 갯수를 파악할 수 있습니다. 관리자 2019.04.11 635
1 [마이그레이션] C++프로젝트 현대화하기 (다시보기-영문) 관리자 2019.04.18 479