레이블이 인스톨실스인 게시물을 표시합니다. 모든 게시물 표시
레이블이 인스톨실스인 게시물을 표시합니다. 모든 게시물 표시

2010년 2월 9일 화요일

인스톨실드에서 다국어 윈도우 지원 스트링 추가 방법

단일 언어 즉 한국어 버전이나 영문버전으로만 작업을 하는 경우에는 별로 상관없는 얘기입니다.

하지만 하나의 어플리케이션을 여러 언어 버전의 다국어 인스톨을 지원해 주기 위해서는

몇가지 작업이 필요하게 됩니다.

 

설치되는 어플리케이션 자체는 다국어 리소스를 지원하지만 설치 프로그램 자체는 다국어  인스톨을

지원하지 못한다면 좀 허접해 보일수 있을거 같네요.

 

다국어 지원 버전의 인스톨 프로그램 만들기에 대해 말씀드리겠습니다.

 

우선 설치 버전이 지원하는 언어 자체를 선택하는 것이 필요합니다.

 

Installation Information ->General Information -> Project Properties 에는

SetUp Languages 란 Properties 가 존재합니다.

 

 

 

보시면 아시겠지만 현재 설치 프로그램은 English(United States)와 Korean 만 지원을 합니다.

인스톨실드 자체의 언어는 매우 세밀하게 구분이 되어 있습니다.

프랑스어도 캐나다 버전, 프랑스 버전 이렇게 구분이 되어 있네요.

 

여기에 Japanese 윈도우를 추가하기 위해서는 아래 체크박스에서 Japanese 를 추가하면 됩니다.

 

 

 

 

 

 

 

기본적인 작업이 끝난 상태구요.

이제부터가 중요합니다.

 

리소스에 IDS_LANGUAGE_KOREAN 란 리소스명을 가진 문자열이 있습니다.

한국어 번역으로는 한국어라고 가정할때

 

이 리소스의 영문 및 일본어 버전을 인스톨실드에 추가하는 작업이 필요하게 됩니다.

번역업체에 의뢰를 했을 경우 기본적으로 워드 파일로 번역작업이 되어 올겁니다.

 

정리해 보면

한국어

IDS_LANGUAGE_KOREAN -> 한국어

영문

IDS_LANGUAGE_KOREAN ->Korean

일본어

IDS_LANGUAGE_KOREAN ->韓国語

 

이렇게 번역이 되어 왔습니다.

 

그러면 개별적으로 각각의 언어 리소스에 등록하는 절차에 대해 알아보겠습니다.

 

일본어의 경우

 

1> 메모장을 실행시킵니다.

IDS_LANGUAGE_KOREAN 입력후 반드시 Tab 으로 커서 위치를 이동합니다.

그 위치에 韓国語 를 입력합니다. 워드 파일인 경우 해당 값을 복사 후 붙여넣기 하시면 됩니다.

 

2>파일을 임의의 위치에 저장합니다.

예제에서는 Resource.txt 로 저장을 합니다. 주의할 점은 반드시 인코딩을 유니코드로

해야 합니다.

 

 

3> 인스톨실드에 리소스 추가하기

Installation Information ->String Tables->Japanese 에서 Import 스트링 메뉴를

실행하여 저장한 텍스트 파일을 추가합니다.

 

 

일본어 리소스에 IDS_LANGUAGE_KOREAN 이란 리소스아이디를 가진 문자열이

정상적으로 추가 되었습니다.

 

다국어 문자열 작업시 주의할점을 정리해 보면

 

1>메모장에서는 반드시 Tab 으로 띄운 후에 문자열 값을  입력합니다.

2>저장시 인코딩은 반드시 유니코드로 합니다.

3>일본어나 러시아어같이 폰트가 사용자 PC 에 저장이 안되어 있는 경우 위와 같은 작업 이후에도

  인스톨실드 String Tables 에서 ?????  같이 값들이 깨져보일수 있습니다.

  하지만 해당 설치 프로그램 작업후 해당 언어에서 설치해 보면 정상적으로 출력이 되니까 염려 안혀하지 않으셔도 됩니다.

4>Installation Information ->String Tables 의 Value 값들을 절대 수동 수정하지 않습니다.

  이렇게 작업하면 100% 깨집니다.

특정 컴포넌트를 사용자가 정의한 특정 위치에 설치하는 방법

인스톨실드로 내부에서 사용되는 predefined folder 는 아래와 같은 것들이 있습니다.

 

 

스크립트상에서는 TARGETDIR,WINDIR 등의 값으로 설치 위치를 제어할수 있게 됩니다.

 

하지만 이미 내부적으로 정의된 위치 이외에 특정 위치 (예를 들어 d:\\contents에 컨텐츠를

설치하고 싶다) 를  나만의 값으로 정의하여 사용하려면 어떻게 해야 할까요?

 

그 방법에 대해 알려 드리겠습니다.

 

1>Application Data -> Files And Folders 로 이동 합니다.

   Destination Folder -> script-defined folders 에서 마우스 우클릭 후 New Folder 를 선택합니다.

  이미지와 같이 를 입력합니다.

 

 

2>새로운 컴포넌트를 추가 후 Destination 을 이미지와 같이 CONTENTS 로 선택합니다.

   Componenet 와 Feature 를 연결해 줍니다.

   예제에서는 Test 란 컴포넌트를 신규로 만들었고 DefaultFeature 에 연결했습니다.

 

 

3>스트립트 상에서 설치 되기 직전 (OnFirstUIBefore 함수 제일 마지막 부분이 좋겠네요)

에 아래와 같은 코드를 입력합니다.

 

아래 스크립트 의미는 CONTENTS 라는 script-defined folder 를 d:\\contents 로 한다는 의미입니다.

 

//컨텐츠 설치 폴더 스크립트로 추가함 d:\\content
    FeatureSetTarget(MEDIA, "", "d:\\contents");

 

이제 다 끝났구요.

이제 빌드를 하시고 설치를 해 보시면 Test Component 는 d:\\contents 에 설치되는 것을

확인하실 수 있을 겁니다.

외부 dll 함수 호출하여 쓰기

인스톨실드로 작업을 하다가 보면 부득이하게 외부의 기능을 사용할 때가 많습니다.

인스톨스크립트로만 해결하면 좋겠지만 지원하지 않는 기능이 있으면 어쩔수 없이 사용을 해야 되겠죠.

 

이번에는 C++  만든 dll 을 호출하여 사용하는 방법에 대해 말씀드리겠습니다.

 

기능은 간단합니다.

 

두개의 int 형 변수를 넘겼을때 두변수의 합을 구하는 dll 을 호출하여 리턴값을 사용하는 방법입니다.

 

1>먼저 dll 만드는 코드입니다.

생성되는 dll 의 이름은 ParseString.dll 입니다. (다른 기능도 사용하느라 명명이 이렇게 되었네요)

우리가 사용할 함수의 이름은 CalSum 입니다.

소스 코드입니다.

 

extern "C" _declspec(dllexport) int CalSum(int number1,int number2);

 

extern "C" _declspec(dllexport) int CalSum(int number1,int number2)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

 int ret = number1+ number2;
 return ret;
}

 

보시면 아시겠지만 C++을 잘 모르시는 분도 누구나 이해가 가능한 코드입니다.

number1+ number2  의 값을 ret 에 할당하여 리턴해 주는 함수입니다.

 

2>인스톨실드상에서 호출하는 방법

- 아래 그림과 같이 Support Files/Billboard 에 dll 파일을 등록합니다.

 

 

 

등록 후에 스크립트 상에 아래와 같은 코드를 작성합니다.

 

//함수의 원형을 선언해 줍니다  parseString 내부의 CalSum  이라는 함수를 사용한다는 의미

prototype cdecl int parseString.CalSum( BYVAL INT, BYVAL INT);  

 

*외부 함수를 호출할때 BYVAL 과 BYREF 두가지 개념이 있습니다. 첫번째는 값 자체 두번째는 포인터 같은 주소 개념입니다. 여기서는 BYVAL 을 사용했습니다.

 

string szDllPath ;

int nResult, retnum ;

 

szDllPath = SUPPORTDIR^"parseString.dll"; //호출하고자 하는 dll 의 경로를 지정해줍니다.
 nResult = UseDLL(szDllPath);  
 
 
    if( nResult = 0 ) then  //UseDll 함수는 dll 이 정상적으로 로드되었을때 0을 리턴합니다.
     retnum = CalSum(1,2); //여기서 3이 리턴되면 제대로 된 결과가 나온겁니다.    
    endif;
 
  UnUseDLL ( szDllPath );     //사용한 dll 은 언로드 해줍니다.

인스톨실드 스트링 처리 방법

설치 프로그램 제작에 가장 범용적으로 사용되는 인스톨실드가 있습니다.

요즘은 Windows Installer 로 제작된 설치 프로그램도 많이 나오는 추세지만 여전히 인스톨실드 로 제작된 많은 설치 프로그램을 만나 볼 수 있습니다.

 

오늘은 인스톨실드의 문자열 처리에 대해 알아보겠습니다.

 

c++에 보면 sprintf , CString 클래스에 보면 format 같은 구문으로 문자 뿐만 아니라 숫자까지 입력받아 문자열에 저장하는 기능을 인스톨실드에서도 제공해 주고 있습니다.

 

 

IDS_INSTALL_WARNING_PROGRAM  입력된 문자는 %s 입니다.\n 입력된 숫자는 %d입니다.

 

이 리소스를 사용하여 문자에 할당하는 예제 코드입니다.

 

LoadStringFromStringTable ("IDS_INSTALL_WARNING_PROGRAM", szMsg );

Sprintf (szString, szMsg, "SMS",3);

MessageBox(szString, SEVERE);

 

이렇게 해서 메시지 창을 띄워보면 아래와 같이 나오게 됩니다.

 

보시면 아시겠지만 C++ 의 CString Format 명령과 거의 동일하죠?

 

문자열을 동적으로 할당하여 즉시 창을 띄우고 싶으시다면

SprintfBox 명령을 사용하시면 됩니다.

아래는 SMS 설치시 Internet Explorer 6.0 설치가 되어 있지 않은 경우 경고창을 띄워주는 코드입니다.

 

아래과 같은 문구가 리소스에 등록되어 있다고 가정합니다.

IDS_INSTALL_WARNING_PROGRAM %s가 설치되어 있지 않습니다.\n설치 완료 후 다음 단계로 진행하시기 바랍니다.

 

LoadStringFromStringTable ("IDS_INSTALL_WARNING_PROGRAM", szString );  //리소스에서 문자열 로딩
 

szPath = "Internet Explorer 6.0";              

                    SprintfBox(INFORMATION, strMsg,szString,szPath,szPath);

 

그러면 아래와 같은 창이 나오게 됩니다.

 

 

이런 방식으로 하나의 문자열에 여러가지 포맷의 문자 또는 숫자입력을 받아 다양한 문자열 처리가 가능하게 됩니다.

 

[인스톨실드]설치대상의 시스템언어에 따른 동적 Feature 설치 방법

설치 대상의 시스템 언어에 따라 필요한 Feature 만 선택하여 설치할 수 있는 방법입니다.

 

예를 들어  프로그램이 설치될   시스템의 언어가 한국어,일본어,프랑스어인 경우 어떻게 동적으로 해당 언어를 디텍팅하여 각각 필요한 Feature 만 설치하는 방법  이정도로 설명 드리면 될까요?

 

1>설치 대상의 언어에 따라 각각 Feature 와 Component 를 등록해 줍니다.

 예제에서는 한국어,일본어,프랑스어에 따른 각각 3개의 Feature 와 Component 를 생성했습니다.(Korean,Japan,France)

 

 

2>Setup Design -> Associate Component 메뉴를 통해 각각의 Feature 와 Component 를 연결해 줍니다.

 Korean, Japan,France 관련되어 모두 작업을 해 줍니다.

 

 

3>스크립트 코드를 작성합니다.

 

NUMBER  nLanguage;

 

nLanguage= SELECTED_LANGUAGE;    //SELECTED_LANGUAGE 는 시스템의 ID 를 numeric Value 로 리턴해 줍니다.               
                 switch (nLanguage)

case ISLANG_KOREAN : //시스템이 한국어인 경우

      FeatureSelectItem (MEDIA, "Korean", TRUE);

      FeatureSelectItem (MEDIA, "Japan", FALSE);
      FeatureSelectItem (MEDIA, "France", FALSE);

 

case ISLANG_JAPANESE : //시스템에 일본어인 경우
      FeatureSelectItem (MEDIA, "Korean", FALSE);

      FeatureSelectItem (MEDIA, "Japan", TRUE);
      FeatureSelectItem (MEDIA, "France", FALSE);

 

 case ISLANG_FRENCH_STANDARD ://시스템에 프랑스어인 경우
      FeatureSelectItem (MEDIA, "Korean", FALSE);

      FeatureSelectItem (MEDIA, "Japan", FALSE);
      FeatureSelectItem (MEDIA, "France", TRUE);

 

endswitch;

 단점이라면 모든 언어의 설치 파일이 인스톨 소스 자체에 포함되어 프로그램 자체가 무거워 진다는 점이 있을수 있습니다.

 

지원하는 언어 코드는 아래와 같습니다.

 

InstallShield Language

InstallScript Constant

English Windows 95, NT 4.0, and Later Equivalent

Basque

ISLANG_BASQUE

Basque

Bulgarian

ISLANG_BULGARIAN

Bulgarian

Catalan

ISLANG_CATALAN

Catalan

Chinese (Simplified)

ISLANG_CHINESE_SIMPLIFIED

Chinese (Simplified)

Chinese (Traditional)

ISLANG_CHINESE_TRADITIONAL

Chinese (Traditional)

Croatian

ISLANG_CROATIAN

Note that for backward compatibility, this constant continues to be 0x001a rather than the more logical 0x041a (in light of its relation to Serbian); you should continue to use this constant rather than ISLANG_CROATIAN_STANDARD.

Croatian

Czech

ISLANG_CZECH

Czech

Danish

ISLANG_DANISH

Danish

Dutch

ISLANG_DUTCH

Dutch (Standard)

English

ISLANG_ENGLISH

English (United States)

Finnish

ISLANG_FINNISH

Finnish

French (Canadian)

ISLANG_FRENCH_CANADIAN

French (Canadian)

French (Standard)

ISLANG_FRENCH_STANDARD

French (Standard)

German

ISLANG_GERMAN

German (Standard)

Greek

ISLANG_GREEK

Greek

Hungarian

ISLANG_HUNGARIAN

Hungarian

Indonesian

ISLANG_INDONESIAN

Indonesian

Italian

ISLANG_ITALIAN

Italian (Standard)

Japanese

ISLANG_JAPANESE

Japanese

Korean

ISLANG_KOREAN

Korean

Norwegian

ISLANG_NORWEGIAN

Norwegian (Bokmal)

Polish

ISLANG_POLISH

Polish

Portuguese (Brazilian)

ISLANG_PORTUGUESE_ BRAZILIAN

Portuguese (Brazilian)

Portuguese (Standard)

ISLANG_PORTUGUESE_STANDARD

Portuguese (Standard)

Romanian

ISLANG_ROMANIAN

Romanian

Russian

ISLANG_RUSSIAN

Russian

Serbian

ISLANG_SERBIAN_CYRILLIC

Serbian (Cyrillic)

Slovak

ISLANG_SLOVAK

Slovak

Slovenian

ISLANG_SLOVENIAN

Slovene

Spanish

ISLANG_SPANISH

Spanish (Traditional Sort)

Swedish

ISLANG_SWEDISH

Swedish

Thai

ISLANG_THAI

Thai

Turkish

ISLANG_TURKISH

Turkish