새로운 글
새로운 덧글

이 기술 자료는 2015 년 11 월 10 일에  AL의 MANNARINO이  게시한 자료를 번역해 정리해 놓은 것입니다.

 

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
 

 

번호 제목 글쓴이 날짜 조회 수
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 관리자 2017.02.06 1269
공지 이 달의 기술자료 & 기술레터 관리자 2017.02.06 377
공지 데브기어 강의 - 2017년 12월~2018년 3월 관리자 2015.01.22 5697
공지 RAD Studio(Delphi, C++Builder) 시작하기 관리자 2015.06.30 9207
공지 RAD 스튜디오로 개발된 모바일 앱 사례(17년 12월 13일 업데이트) 험프리 2014.01.16 146707
811 TFrame의 생성 및 해제를 편하게 해주는 TFrame 관리 클래스입니다.. file 푸른솔 2017.12.15 15
810 [10.2 도쿄][릴리즈2] 기타 10.2.2에서 추가 강화된 내용 file 험프리 2017.12.13 70
809 [10.2 도쿄][릴리즈2] RAD 서버 싱글 사이트 개발 라이선스 제공 험프리 2017.12.13 54
808 [10.2 도쿄][릴리즈2] 새로운 VCL 컨트롤 4종을 사용할 수 있습니다. file 험프리 2017.12.13 51
807 [10.2 도쿄][릴리즈2] FireMonkey 퀵에디트로 주요 속성을 시각적으로 빠르게 설정할 수 있습니다. file 험프리 2017.12.13 28
806 [10.2 도쿄][릴리즈2] IDE 룩앤필이 새로워졌습니다. - 다크테마 지원, 컴포넌트 아이콘 변경 file 험프리 2017.12.13 39
805 [업데이트][10.2 도쿄][릴리즈 2] 10.2 도쿄 - 릴리즈 2 출시 & 설치방법 안내 file 험프리 2017.12.13 194
804 [고객사례-설치도구, 델파이] RAD 안드로이드 관리자 2017.12.06 67
» 이전 버전 C ++ 빌더 애플리케이션을 C ++ 빌더 10 시애틀로 마이그레이션 file 김원경 2017.11.24 132
802 이 달의 기술자료 - 2017년 12월 file 험프리 2017.11.24 157
801 수원과학대 학생이 델파이로 개발한 '축구 리그 앱' 관리자 2017.11.24 131
800 [발표자료] 20171117 델파이/C++빌더 제조/제어 개발 세미나 관리자 2017.11.20 111
799 [발표자료] 20171116 델파이/C++빌더 의료 개발 세미나 관리자 2017.11.17 93
798 [발표자료] 20171109 RAD스튜디오 100% 활용하기: 최신 기술 적용과 확장 관리자 2017.11.10 118
797 RAD 스튜디오 - 사물인터넷 관련기술과 고객사례 험프리 2017.10.31 205
796 [고객사례-설치도구, 델파이] RAD&Installer 관리자 2017.10.31 174
795 이 달의 기술자료 - 2017년 11월 file 험프리 2017.10.30 179
794 안면인식(Face Detection) 라이브러리(안드로이드, iOS) 험프리 2017.10.30 161
793 TTS(Text-to-Speech) 라이브러리(윈도우, 맥OS, iOS, 안드로이드) 험프리 2017.10.30 111
792 델파이로 빅데이터 데이터베이스 연동하기(Cassandra, Couchbase, MongoDB) 험프리 2017.10.30 186


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