새로운 글
새로운 덧글

이 기술 자료는 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
 

 

번호 제목 글쓴이 날짜 조회 수
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 229
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 4146
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 820
공지 [프로그래밍 강의] 2018.10 ~ 2018.12 관리자 2015.01.22 6793
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 관리자 2015.06.30 11927
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2018년 09월 업데이트 됨) 험프리 2014.01.16 148966
833 [업데이트][패치][10.2.3] RAD스튜디오 10.2.3 패치와 새로운 기술 정보들 관리자 2018.04.24 350
832 [고객사례-비콘, 위치 추적, RAD스튜디오, RAD서버] BEAM 관리자 2018.04.18 262
831 이 달의 기술자료 - 2018년 04월 file 험프리 2018.03.30 355
830 [10.2 도쿄][릴리즈3] RAD서버에서 센차 Ext JS 지원 확장 관리자 2018.03.30 223
829 [10.2 도쿄][릴리즈3] C++빌더 리네임 리팩토링 지원 관리자 2018.03.30 116
828 [10.2 도쿄][릴리즈3] 파이어몽키 UI 템플릿 관리자 2018.03.30 323
827 [10.2 도쿄][릴리즈3] CMake 커맨드 라인 지원 관리자 2018.03.30 141
826 [고객사례-위치확인, 배터리 문제 해결, 모바일, 델파이] WhereontheMap [1] 관리자 2018.03.29 242
825 [발표자료] 20180315 마이그레이션, 생각보다 더 쉽습니다 (C++빌더, 델파이) file 관리자 2018.03.19 276
824 [업데이트][10.2 도쿄][릴리즈 3] 10.2 도쿄 - 릴리즈 3 출시 & 설치방법 안내 관리자 2018.03.14 761
823 이 달의 기술자료 - 2018년 03월 file 험프리 2018.02.23 490
822 [발표자료] 2018022 마이크로서비스 아키텍처 구현과 활용 with RAD서버 file 관리자 2018.02.23 210
821 [업데이트][핫픽스][10.2.2] RTL 호환성패치 및 안드로이드 애니메이션 문제 해결 - 2018년 2월 패치 file 험프리 2018.02.20 246
820 개발자가 고민하는 마이그레이션 논쟁 해소를 위한 7가지 핵심 방안 file 관리자 2018.02.19 369
819 [고객사례-UI컴포넌트 개발도구, 델파이] 페트라 (Petra) 관리자 2018.02.01 717
818 이 달의 기술자료 - 2018년 02월 file 험프리 2018.01.25 314
817 [업데이트][핫픽스][10.2.2] 웰컴 페이지 패치 험프리 2018.01.25 189
816 2017년 가장 많이 클릭된 기술자료 TOP 7 관리자 2018.01.23 940
815 [발표자료] 2018011 What's NEW! RAD스튜디오 10.2.2 관리자 2018.01.18 208
814 이 달의 기술자료 - 2018년 01월 험프리 2017.12.28 322


광고 모듈이 설치되어 있지 않아 실행을 중단합니다..