통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34000 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 성공적인 프로젝트를 위한 다국어 리소스 준비 - 2  | VC++ 일반 2006-03-22 오후 7:29:17
 dreamcot  dreamcot님께 메시지 보내기dreamcot님을 내 주소록에 추가합니다.dreamcot님의 개인게시판 가기 번호: 7282  / 읽음:12,016

성공적인 프로젝트를 위한 다국어 리소스 준비 - 2

 

1. 리소스 라이브러리?

 

앞서의 글에서 이야기한 다국어 리소스 대응 방식으로는, 다국어 리소스가 많아지면 관리하기도 어려워지고, 컴파일되어 나온 출력물이 커지는 단점이 있습니다.

 

 

이런 경우 각각의 언어에 대응되는 리소스들을 따로 혹은 몇 개를 묶어서 라이브러리화 하면, 유지보수 하기가 한 결 쉬어 집니다. 때때로 코드페이지의 한계로 같이 편집할 수 없는 언어들도 있습니다. 이런 경우도 분리하셔야 합니다.

 

2. 리소스 라이브러리 만드는 방법

 


  1. dll 형식의 프로젝트를 하나 만듭니다. (MFC dll 이 아니어도 상관없습니다.).

 

  2. 원래의 프로젝트에서 resource.h , *.rc, 프로젝트 폴더 안에 있는 RES 폴더를 통째로 복사합니다.

 

  3. 필요한 언어 리소스들의 Copy를 아래 그림처럼 추가하고, 필요 없는 언어의 리소스는 모두 제거합니다. (링크시 Resources의 Preprocessor Definitions에 _AFXDLL을 넣어주시기 바랍니다. 쓸데 없는 MFC 리소스가 같이 따라오지 않습니다.)

 

 

(다이얼로그 템플릿, 버젼 정보, 스트링 테이블을 제외한 이미지 혹은 아이콘 같은 언어 중립적인 요소들은 경우에 따라서는, 위와는 별도로 따로 관리하는 편이 훨씬 편할 수도 있습니다. )

 

 

3. 어떻게 이용하나?

 

이렇게 해서 생성된 리소스 라이브러리를 이용하는 법은 아주 간단합니다. 리소스 라이브러리를 LoadLibary을 통해서 불러온 후, MFC의 경우는 AfxSetResourceHandle 함수를 통해서, 리소스 라이브러리의 핸들을 설정해 주면 됩니다. MFC를 이용하는 경우는, LoadResource를 통해서 특정 리소스를 가져 오지 않는다면, 이 후로는 리소스 라이브러리에 대한 생각은 반쯤은 잊어버리셔도 상관 없을 것 같습니다.

 


HMODULE hModule = LoadLibrary( _T("resourcedll.dll"));
AfxSetResourceHandle( hModule );

 

 

API의 경우는 아래와 같이 사용하시면 됩니다.

 

 

HMODULE hModule = LoadLibrary( _T("resourcedll.dll"));
LoadString( hModule , ... );
LoadResource( hModule ,... );
HMENU hMenu = LoadMenu( hModule, ... );

 

 

4. 샘플 소스

 

샘플 소스는 첫 번째 글에서 사용하였던 소스를 그대로 응용해서, 한글 리소스와 일본어 리소스를 리소스 라이브러리로 만들어서 테스트 해 보았습니다.

 

 

이름을 바꾸지 않아서, 똑같은 이름의 리소스가 3개나 있어서 무척 헷갈리기는 하지만, 위와 같이 각각 영어, 한국어, 일본어의 3개의 언어가 준비되었다는 것을 알 수 있습니다.

 


if( strCommandLine.Find(_T("english")) >= 0 )
{
     SetThreadLocale( MAKELCID( MAKELANGID(LANG_ENGLISH , SUBLANG_ENGLISH_US) , SORT_DEFAULT));
}
else
if( strCommandLine.Find(_T("japanese")) >= 0 )
{
    strAppPath += _T("\\resourcejap.dll");
    HMODULE hModule = LoadLibrary( strAppPath );
    AfxSetResourceHandle( hModule );

    SetThreadLocale( MAKELCID( MAKELANGID(LANG_JAPANESE , SUBLANG_DEFAULT) , SORT_DEFAULT));
}
else
{
    strAppPath += _T("\\resourcedll.dll");
    HMODULE hModule = LoadLibrary( _T("resourcedll.dll"));
    AfxSetResourceHandle( hModule );


    SetThreadLocale( MAKELCID( MAKELANGID(LANG_KOREAN , SUBLANG_KOREAN) , SORT_DEFAULT));
}

 

 

위의 코드에서 볼 수 있는 것과 같이 영문의 경우는, 로케일만 영문으로, 한국어와 일본어의 경우, 로케일 뿐만 아니라 외부의 라이브러리를 통해서 리소스를 불러 오게 했습니다.

만약 위의 코드에서, 일본어나 한국어 리소스 라이브러리를 못 찾는 경우는, 응용 프로그램에 있는 영문 리소스가 올라오거나 혹은 대화 상자가 제대로 나타나지 않아야 합니다.

 

 

테스트 결과를 보면 훌륭하게 잘 동작하는 것을 알 수 있습니다.

 

5. 결론

 

정리하자면, 리소스만을 따로 분리해서 동적 라이브러리 형태로 만들 수 있고, 이러한 라이브러리를 프로그램 행 시실 동적으로 호출하여, 리소스를 찾거나 혹은 불러 들이는 것이 가능합니다. 이게 오늘의 결론이군요.

 

한 가지, 주의하실 점은 이러한 종류의 프로그램, 즉 지역화 대비가 잘 된 프로그램들은, 프로그램 UI 변경에 무척 신경을 쓰셔야 합니다. 이러한 프로그램에서 UI 한 군데가 변경이 된다는 것은, 지역화된 언어들의 UI또한 모두 변해야 한다는 뜻이고, 개발자는 반드시 이러한 부분에 대해서 배포 하시기 전에 반드시 확인하셔야 합니다.

 

그럼 즐거운 프로그래밍 하세요!

 

[코멘트] 좋음
2006-03-23 02:06
 dreamcot  dreamcot님께 메시지 보내기dreamcot님을 내 주소록에 추가합니다.dreamcot님의 개인게시판 가기 
아참 첨부된 소스 코드에서 일본어 리소스는 일본어 윈도우가 아니면 열어 보지 마세요. 글자가 깨집니다.
저장 취소
[코멘트] 좋음
2006-03-26 00:58
 junyoungky  junyoungky님께 메시지 보내기junyoungky님을 내 주소록에 추가합니다.junyoungky님의 개인게시판 가기 
유용한 글 감사합니다.

많은 도움이 됐습니다.
저장 취소
[코멘트] 좋음
2006-04-11 10:00
 surfree  surfree님께 메시지 보내기surfree님을 내 주소록에 추가합니다.surfree님의 개인게시판 가기 
리소스에서 _AFXDLL을 PreProcessor에 넣으면 쓸데없는 MFC 리소스가 포함되지 않는군요.
좋은정보 감사합니다. 없애볼려고 많이 노력했었는데...쉽게 해결되는군요
저장 취소
[코멘트] 좋음
2006-05-18 17:38
 wolfmax  wolfmax님께 메시지 보내기wolfmax님을 내 주소록에 추가합니다.wolfmax님의 개인게시판 가기 
상당히 유용한 강좌 였습니다.

여기서 추가로

INI를 이용한 리소스관리에 대한 프로그램설계및 기법, 예제 파일들이 있으면 좋겠군요....
저장 취소
[코멘트] 놀람
2007-03-15 16:57
 rosejeong  rosejeong님께 메시지 보내기rosejeong님을 내 주소록에 추가합니다.rosejeong님의 개인게시판 가기 
참 유용한 강좌입니다
질문 하나만 해도 될런지요? 본내용은 DLL을 나누어서 하였던데...
혹시 하나의 DLL을 써서 하는 방법은 없을런지요?

즉본문처럼 나누어서 리소스를 만들지 말고 하나의 프로젝트 안에
IDD_TEST_DIALOG,
IDD_TEST_DIALOG[English (U.S)]
IDD_TEST_DIALOG[Japanes]
이렇게 만든후 DLL을 만들고(여기까지는 만들어 지더군요..)
APP에서 DLL을 불러보는 거지요..
일케는 안될런지요?
저장 취소
[코멘트] 좋음
2010-05-21 09:05
 elvicelee  elvicelee님께 메시지 보내기elvicelee님을 내 주소록에 추가합니다.elvicelee님의 개인게시판 가기 
감사합니다.
테스트 프로그램을 만들어서 실행했는데
매우 잘 되더군요,

내가 이것 땜에 일주일간 밥을 못 먹었습니다.
근데 살은 더 찌더군요.

오늘은 초파일인데, 역시 고마움을 전해야 겠군요 ^^&
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.