C++Builder 이전 버전 C ++ 빌더 애플리케이션을 C ++ 빌더 10 시애틀로 마이그레이션
2017.11.24 15:51
이 기술 자료는 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를 사용하는 방법에 따라 소스코드에 유니 코드 변환을 해야 할 수도 있습니다 . 몇 가지 예 :
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로 대체하지 마십시오. 대신 아래의 두 함수를 정의하십시오.
char * 타입을 입력 매개변수로 사용하고 wchar_t * 을 리턴하거나 매개변수와 리턴값이 반대인 경우에 이들을
사용하십시오.
주의 :이 기능을 사용하기 편리하게 만드는 기능, 즉 정적 버퍼는 원하지 않는 동작을 유발할 수 있습니다.
AnsiOf / UnicodeOf가 AnsiOf / UnicodeOf를 호출 할 수있는 함수의 인자로 호출되지 않았는지 또는
AnsiOf / UnicodeOf가 동일한 함수의 두 개 이상의 인자로 사용되지 않는지 확인하십시오.
3. 해당되는 경우 "AnsiOf"또는 "UnicodeOf" 함수 호출을 추가하여 프로젝트를 컴파일하고
타입 오류를 해결합니다. 오류가 없을때까지 프로젝트를 계속 컴파일 하십시오.
4. 모든 sprintf, fwrite 등을 사용하는 곳을 검색하십시오. 이러한 함수들은 매개변수 일부가 모든 변수 타입을
허용하므로 컴파일러에서 오류메세지가 나타나지 않을 수도 있습니다.
AnsiOf 함수 호출을 해야하는지 수동으로 확인하십시오. 또는 필요에 따라 %s 대신 %S를 사용하도록
포맷 지정자를 업데이트하십시오.
5. 최적화 : AnsiOf 및 UnicodeOf의 중복 사용을 제거합니다.
예를 들어 fopen(AnsiOf(... 를 _wfopen(... 로 쉽게 대체 할 수 있습니다. 또한 fnsplit(AnsiOf를 _wfnsplit(...로
다른 매개변수도 wchar_t로 정의해야하며, 그로 인한 너무 많은 파급 효과는 발생하지는 않습니다.
또한 sscanf(UnicodeOf(...를 swscanf(...로 대체 해야합니다.
변수 중 일부를 char에서 wchar_t로 변환하는 것이 가장 바람직합니다. strcpy 등의 문자열 함수를 사용했다면
대부분의 경우 str을 wcs로 대체해야합니다.
strcpy 함수를 사용 할 수 있는 버전에서 strncpy(s1, s2, sizeof(s1) -1)를 사용했다면 wchar_t의 배열 크기가 문자를
2배로 확보할 수 있기때문에 wcsncpy(s1, s2, sizeof (s1) / 2-1) 로 대체합니다.
6. TColorGrid와 같은 일부 VCL 컴포넌트를 더 이상 사용할 수 없으므로 해결 방법을 찾아야합니다.
7. 컴파일러가 일부 함수나 오브젝트 속성이 더 이상 사용 할 수 없다고 알려줄 것입니다.
그러한 오류들도 수정하셔야 합니다.
엠바카데로 C ++ 빌더 애플리케이션을 유니 코드로 포팅하기 위한 팁
1. 응용 프로그램의 프로젝트 설정 _TCHAR을 wchar_t로 매핑하십시오. 새 응용 프로그램에 대한 기본 설정은
사용자가 지정 할 수 있습니다 디폴트로 char로 설정됩니다.
2. 검색을 먼저 수행하고 교체하면서 시작하십시오. 예를들면 :AnsiString의 모든 인스턴스를 UnicodeString로
AnsiCompare, AnsiPos, AnsiCompareIC의 모든 인스턴스를 각각 Compare, Pos, CompareIC로 대체합니다.
3. 모든 문자를 자동으로 wchar_t로 변경하지 마십시오. 먼저 각 파일을보고 변경 사항이 올바른지 확인하십시오.
AnsiString을 사용하기위한 코드를 작성하지 않았다면 변경사항에 특별한주의가 필요한 부분이 있습니다.
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이 변환을 처리하도록 합니다. UnicodeString에 AnsiString을 할당 할 수 있으며
그 반대의 경우(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
관련된 온라인 세미나 다시보기를 볼 수 있습니다.
Migrating your C++Builder Projects to Unicode -
https://www.youtube.com/watch?v=H-KFq5M0z0A