이제 봄이라는 생각이 들 정도로 따뜻했던 얼마 전에는 동물원에 갔답니다. 난생 처음 보는 동물들에 우리 딸 아이는 눈이 동그래져서 이것저것 보느라 정신이 없더군요. 매일 매일 비슷한 일상에 별로 새로울 것 없는 일들만 경험하는 삶과는 다르게 아이들의 삶은 매일 혁명과 같지 않을까 하는 생각이 드네요. 이번 연재에서는 윈도우 애플리케이션에서 리소스를 관리하는 정통적인 방법인 .RES 파일의 사용 방법을 익히고, 입력 로케일의 영향을 받지 않도록 파일 입출력을 하는 방법에 대해서도 알아보기로 합니다.
리소스 파일 사용하기
RES 이용하기
RES 파일은 윈도우 애플리케이션에서 리소스를 관리하는 데 흔히 사용되는 파일 형식입니다. 비주얼 베이직에서 이를 사용하는 간단한 예제를 만들어 봅시다.
우선 표준 EXE 형식의 프로젝트를 하나 생성하고 「추가 기능
우선 문자열 테이블을 생성하여 101번 ID를 가지는 문자열에 “안녕하세요?”라는 문자열을 입력해 봅시다. 다음으로 아이콘 추가 버튼을 추가하여 아이콘 파일을 하나 추가하고 ID를 201로 변경해 둡니다. 마지막으로 사용자 정의 리소스 버튼을 추가하고 AVI 파일을 선택하여 리소스에 추가합니다. 이후 “CUSTOM”으로 표기된 AVI 리소스 항목의 속성을 AVI라고 변경해 둡시다. 이 작업을 마치고 나면 리소스 편집기의 모습이 <화면 1>과 같습니다.
이제 폼에 CommandButton 3개와 Picture 컨트롤 1개, Animation 컨트롤을 하나씩 추가하여 폼을 구성해 봅시다. 리소스 파일에서 리소스를 불러오기 위해 사용되는 함수는 다음과 같습니다.
◆ LoadResPicture : RES 파일에서 비트맵, 아이콘, 커서 등을 불러와 StdPicture 객체로 반환합니다.
◆ LoadResData : RES 파일에서 기타 리소스를 가져와 바이너리 배열을 반환합니다.
RES 파일에서 리소스를 불러오기 위해 사용한 코드는 <리스트 1>과 같습니다.
LoadResString이나 LoadResPicture 함수는 사용법이 간단하니 독자 여러분이 한번 보면 될 것이고, LoadResData의 사용법은 다른 함수와 달리 유의할 사항이 있으므로 같이 살펴보기로 합시다.
우선 GetTempPath 윈도우 API 함수를 이용하여 윈도우에서 사용중인 임시 폴더를 얻어오기로 합시다.
FileNumber = FreeFile
Open sTempFile For Binary Access Write As FileNumber
이후 앞과 같이 실제 임시 파일의 이름을 구성합니다.
LoadResData를 이용하여 AVI 파일을 바이트 배열로 받아온 후,
임시 파일에 기록합니다. 이렇게 기록된 임시 파일은 애니메이션 컨트롤에서 불러 쓸 수 있게 됩니다.
프로그램을 실제로 실행해 보면 <화면 3>과 같은 결과를 얻을 수 있습니다.
RES 파일 편집의 문제점
한 가지 언어의 문자열만을 RES 파일에 저장한다면 비주얼 베이직의 리소스 편집기를 이용해도 아무런 문제점이 발생하지 않습니다. 하지만 두 가지 이상의 언어를 RES 파일에 저장하려면 신중해져야 할 필요가 있습니다. 영어와 한국어 리소스를 하나의 RES 파일에 저장한다고 가정해 보겠습니다. 이 리소스를 한국어 개발 환경에서 편집한다면 그리 큰 문제가 발생하지 않을 것입니다.
하지만 RES 파일을 영어 개발 환경에서 편집해서 저장하는 순간 저장되었던 한국어 문자열 리소스들은 모두 깨져 버리고 맙니다. 그렇다면 한국어 개발 환경에서만 편집하면 되지 않겠느냐고 생각할 독자들도 있을 것입니다. 하지만 두 가지 언어가 아닌 그 이상의 언어 리소스들을 하나의 리소스 파일에 넣으려면 어떻게 해야 할까요? 이럴 경우 비주얼 베이직만으로는 해결할 방법이 없게 됩니다.
RC 파일 이용하기
RES 파일은 바이너리 파일입니다. 이 RES 파일은 RC 파일을 컴파일해서 얻을 수도 있습니다. 그래서 우리는 이 방법을 이용해 보기로 합니다.
우선 RC 파일의 기본 틀을 얻기 위해 비주얼 C++를 이용해 보기로 합시다. 비주얼 C++에서 「New
주의해야 할 점은 이 RC 파일을 반드시 유니코드로 저장해야 한다는 점입니다. 이를 ASCII 파일로 저장하게 되면 일본어 문자열 리소스들이 깨지게 되므로 주의해야 합니다. 각 언어별로 문자열 정의하는 부분은 유사하므로 그중 한국어 문자열 리소스 부분을 가져와 살펴보기로 합시다.
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT 이 부분이 리소스의 언어를 설정하는 부분이며, #pragma code_page(65001)는 실제로 이 리소스 문자열들이 어떻게 인코딩되어 저장되었는지를 나타내는 부분입니다. 65001은 UTF-8에 해당하는 코드입니다.
이제 이 RC 파일을 이용해 RES 파일을 만들어 보기로 합시다. 먼저 명령창을 하나 띄워 RC 파일이 저장된 폴더로 이동합시다. 리소스 컴파일러인 RC.exe를 이용해 TestRC.RES를 생성합니다. 문제없이 TestRC.RES가 컴파일되었다면 이제 이 파일을 비주얼 베이직 프로젝트에 이용해 보겠습니다.
TestRC.frm을 <화면 5>와 같이 구성하고, 리소스 편집기로 TestRC.RES를 불러와 프로젝트에 포함시킵니다. 이제 TestRC.frm의 코드를 한번 살펴보겠습니다.
TestRC.frm의 주 내용은 SetThreadLocale 윈도우 API 함수를 이용하여 실행중인 프로그램의 로케일을 잠시 변경한 후 리소스에서 문자열을 가져오는 코드입니다. 이 프로그램을 정확히 테스트해 보려면 반드시 컴파일해서 실행 파일을 만들어야 합니다. 컴파일된 실행 파일을 실행하면 <화면 6, 7, 8>과 같은 결과를 얻을 수 있습니다.
파일 입출력도 신경쓰자!
비주얼 베이직의 기본 파일 입출력이나 FileSystemObject를 사용할 경우 시스템의 기본 로케일과 맞지 않는 언어의 경우 파일의 내용이 깨지게 됩니다. 이럴 경우 시스템 로케일과 무관하게 파일 입출력을 하려면 ADODB.Stream을 사용하면 됩니다.
비주얼 C++ 다국어 프로그래밍
지난 연재에 이어 2회에 걸쳐 비주얼 베이직에서의 다국어 프로그래밍에 대해 살펴보았습니다. 실전에서는 지금 소개해 드린 내용들보다 더 많은 지식이 필요할 것입니다. 끊임없이 노력하고 공부하는 독자 여러분이 되길 바랍니다. 다음 연재에서는 비주얼 C++로 다국어 프로그래밍을 할 때의 유의사항에 대해 간단히 알아보겠습니다. @
* 이 기사는 ZDNet Korea의 자매지인 마이크로소프트웨어에 게재된 내용입니다.
지금 뜨는 기사
이시각 헤드라인
ZDNet Power Center










