engineering/System Eng.2007. 3. 9. 09:47


출처 - http://kin.naver.com/knowhow/entry.php?d1id=3&dir_id=3&eid=DV7BINcdSKfXO5Pt8AqguM5pDM4QXkwq&qb=bnNpcyBmaWxlIMb3x9Q=




NSIS 스크립트 예제>

=========================================================================================

;NSIS Modern User Interface
;Eocs (굴단::Nuke팀::헌터)
;Written by Eocs (=Arian2u,4u=SJWannabe=DeadlyAngel)

;★★★--------------------------------
;Include Modern UI
  !include "MUI.nsh" ; ◀ Modern UI 의 헤더파일입니다.

                            ; (Modern UI 는 최근의 윈도에서 사용되는 마법사와 같은 형태의

                            인터페이스를 갖추고 있습니다.)

;★★★--------------------------------
;General

;Name and file
  Name "Nuke UI Ver 0.7 베타" ; ◀ 셋업 실행시 상단에 나타날 프로그램 명칭입니다.
  OutFile "Nuke_Setup.exe" ; ◀ 셋업파일명을 지정해줍니다.

;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\Nuke UI Beta" "" ; ◀ 레지스트리에 등록합니다.

;★★★--------------------------------
;Interface Settings
  !define MUI_ABORTWARNING

;★★★--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE $(myLicenseData) ; ◀ 아래의 A) LicenseData와 맞물려

                                                                            한글 txt 파일을 읽어들입니다.
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES

;★★★--------------------------------
;Languages
!define EUL_RUL "를"       ;한글 (을)(를) 처리 ; ◀ 한글 (을)(를)처리를 수정해줍니다.
!insertmacro MUI_LANGUAGE "Korean" ; ◀ 기본 언어를 한글로 설정합니다.

;Reserve Files
  !insertmacro MUI_RESERVEFILE_LANGDLL

LicenseLangString myLicenseData ${LANG_KOREAN} "${NSISDIR}\Docs\Modern UI\License_NukeUI_KR.txt"
LicenseData $(myLicenseData) ; ◀ A) LicenseLangString과 함께 사용하여 라이센스

                                             정보를 한글 파일로 사용할 수 있도록 합니다.

;★★★--------------------------------
;함수 내에서만 실행되는 것들 처리
Function .onInit         ;onInit
;WOW가 설치된 경로 가져오기
ReadRegStr $INSTDIR HKEY_LOCAL_MACHINE "SOFTWARE\Blizzard Entertainment\World of Warcraft" "InstallPath" ; ◀ 레지스트리의 값을 읽어서 $INSTDIR에 저장합니다.
;중복실행 방지
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "NukeUI_Beta_0.7") i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
  MessageBox MB_OK|MB_ICONEXCLAMATION "NukeUI 0.7 설치를 위한 인스톨러가 이미 실행중입니다. - Eocs (굴단::Nuke팀::헌터) -" ; ◀ Mutex를 만들어 중복실행을 방지합니다.
  Abort
FunctionEnd

;★★★--------------------------------
;Default installation folder
InstallDir $INSTDIR ; ◀ 기본 설정 경로를 지정합니다.

;★★★--------------------------------
;Installer Sections - 필수 애드온 (UnitFrame 관련, Raid 관련, Sct, SpellAllert 등...)
Section "!필수(공통) 기능" GR_COMMON ; ◀ !가 들어간 Section의 문자열은 굵게 나타납니다.
SectionIn RO ; ◀ 필수 선택으로 Read Only

  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\NukeUI "Install_Dir" "$INSTDIR" ; ◀ 인스톨 경로를 레지스트리에

                                                                                          등록합니다.

  ; Write the uninstall keys for Windows

  ; ◀ 아래의 4줄은 Uninstall 정보를 레지스트리에 등록합니다.
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "DisplayName" "Nuke UI Ver 0.7 베타"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "UninstallString" '"$INSTDIR\Uninstall_NukeUI.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "NoRepair" 1
WriteUninstaller "$INSTDIR\Uninstall_NukeUI.exe"

;Start Menu Shortcuts ; ◀ 프로그램 그룹에 등록하고, 언인스톨의 바로가기 아이콘을 만듭니다.
  CreateDirectory "$SMPROGRAMS\Nuke UI Ver 0.7 베타"
  CreateShortCut "$SMPROGRAMS\Nuke UI Ver 0.7 베타\Nuke UI 언인스톨(제거).lnk" "$INSTDIR\Uninstall_NukeUI.exe" "" "$INSTDIR\Uninstall_NukeUI.exe" 0

;Remove And Create Directory
  RMDir /r "$INSTDIR\Interface" ; Interface(AddOns) 폴더 삭제 ; ◀ /r 옵션은 하위폴더를 포함
RMDir /r "$INSTDIR\WTF" ; WTF(Account) 폴더 삭제
CreateDirectory "$INSTDIR\Interface"  ; Interface(AddOns) 폴더 생
CreateDirectory "$INSTDIR\WTF"    ; WTF(Account) 폴더 생성

;필수(공통) 애드온 설치
SetOutPath "$INSTDIR\Interface\AddOns\!ImprovedErrorFrame"
File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\!ImprovedErrorFrame\" ; ◀ /r 옵션으로 모두 포함
SetOutPath "$INSTDIR\Interface\AddOns\!StopTheSpam"
;이하 생략 합니다.

;.

;.

;.


;WTF\Account 폴더에 설정 파일 설치
SetOutPath "$INSTDIR\WTF\Account\계정이름입력"
File /r "..\..\..\..\Account(NukeUI 0.7배포)\계정이름입력\"
SectionEnd

;★★★--------------------------------
;Installer Sections - 타이탄 패널과 플러그인
SectionGroup /e "타이탄 패널" GR_TITAN ; ◀ /e 옵션은 Expand입니다. 옵션을 확장시킵니다.
Section "타이탄 기본" SecTitan
 SectionIn RO
 SetOutPath "$INSTDIR\Interface\AddOns\Titan"
 File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\Titan\"
 SetOutPath "$INSTDIR\Interface\AddOns\TitanAmmo"
 File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanAmmo\"
 SetOutPath "$INSTDIR\Interface\AddOns\TitanBag"
 File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanBag\"
 SetOutPath "$INSTDIR\Interface\AddOns\TitanClock"
 File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanClock\"
 ;이하 생략합니다.

  ;.

  ;.

  ;.
SectionEnd
SectionGroup "타이탄 추가" GR_T_PLUGIN
Section "경험치표시" SecTitanXPStatus
  SectionIn RO
  SetOutPath "$INSTDIR\Interface\AddOns\TitanXPStatus"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanXPStatus\"
 SectionEnd
 Section /o "어그로경고" SecTitanAggro
  SetOutPath "$INSTDIR\Interface\AddOns\TitanAggro"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanAggro\"
 SectionEnd
 ;이하 생략합니다.

  ;.

  ;.

  ;.
SectionGroupEnd
SectionGroupEnd ; ◀ SectionGroup내에 여러 Section과 하위 SectionGroup이 있습니다.

;★★★--------------------------------

; 이하 SectionGroup과 Section들 생략합니다.

;.

;.

;.


;★★★--------------------------------
;Descriptions

  ;Language strings ; ◀ 각 섹션그룹과 섹션의 설명(툴팁) 문자열을 지정합니다.
LangString DESC_GR_COMMON ${LANG_KOREAN} "Nuke UI Ver 0.7 베타의 공통 라이브러리 입니다.(필수)"
LangString DESC_GR_TITAN ${LANG_KOREAN} "타이탄 패널입니다. WOW 화면 상하단에 유용한 기능들을 제공합니다. (필수+선택)"
LangString DESC_GR_T_PLUGIN ${LANG_KOREAN} "타이탄 패널용 플러그인 입니다. 컴퓨터 사양을 고려하여 목적에 따라 설치하시기바랍니다. (선택)"
LangString DESC_SecTitanXPStatus ${LANG_KOREAN} "Titan Panel을 경험치바 형식으로 보이게하고 경험치 정보를 표시합니다. (필수)"
LangString DESC_SecTitanAggro ${LANG_KOREAN} "어그로 대상을 탐지하고 알려주는 기능을 제공합니다. (선택)"
  ;이하 생략합니다.

  ;.

  ;.

  ;.


  ;Assign language strings to sections  ; ◀ 지정한 설명(툴팁) 문자열을 나타내도록 합니다.
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
 !insertmacro MUI_DESCRIPTION_TEXT ${GR_COMMON} $(DESC_GR_COMMON)
 !insertmacro MUI_DESCRIPTION_TEXT ${GR_T_PLUGIN} $(DESC_GR_T_PLUGIN)
 !insertmacro MUI_DESCRIPTION_TEXT ${SecTitan} $(DESC_SecTitan)
 !insertmacro MUI_DESCRIPTION_TEXT ${SecTitanXPStatus} $(DESC_SecTitanXPStatus)
  ;이하 생략합니다.

 ;.

  ;.

 ;.

;★★★--------------------------------
;Uninstaller Section

Section "Uninstall"

  ; Remove registry keys  ; ◀ 레지스트리에서 정보를 삭제합니다.
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI"
  DeleteRegKey HKLM SOFTWARE\NukeUI

  ; Remove files and uninstaller
  Delete $INSTDIR\Uninstall_NukeUI.exe ; ◀ 언인스톨용 exe 삭제

  ; Remove shortcuts
  Delete "$SMPROGRAMS\Nuke UI Ver 0.7 베타\*.*"

  ; Remove directories used for shortcuts
  RMDir "$SMPROGRAMS\Nuke UI Ver 0.7 베타" ; ◀ 시작 프로그램에 등록된 것들 삭제

; Remove WOW Inferace And WTF Folder
  RMDir /r "$INSTDIR\Interface" ; Interface(AddOns) 폴더 삭제 ; ◀ /r 옵션으로 모두 삭제
RMDir /r "$INSTDIR\WTF" ; WTF(Account) 폴더 삭제 ; ◀ /r 옵션으로 모두 삭제

SectionEnd

=========================================================================================

※ 중요하다고 생각되는 부분만 설명 추가로 주석을 달았습니다.

   위 내용만으로 충분히 샘플 스크립트 역할을 하리라고 보는데요 ^^;

   NSIS 설치 후, 제공하는 NSIS Examples Directory 폴더의 내용들과

   http://nsis.sourceforge.net/ 의 자료들을 통해서 많은 부분 알 수 있었습니다.

   http://jgh0721.egloos.com/ 헬마님의 자료도 많은 도움이 되었습니다.

   이 자리를 빌어 감사드립니다. ^^;

   HELP, CHM과 위의 내용들로 기본 부분은 충분히 이해할 수 있으리라 생각합니다.

※ 이상 미흡하지만, WOW 애드온 배포본 제작할 때 NSIS로 스크립트를 작성하면서

   기초적인 NSIS 스크립트에 대한 이해를 돕기위해 작성한 글이었습니다.

Posted by theYoungman
engineering/System Eng.2007. 3. 7. 09:19


출처 : http://www.kipple.pe.kr/doc/nsis/



NSIS : NSIS 소개와 패치/샘플
정보
패치파일
  • 받기 : NSIS2X_PATCH.EXE(245KB) (설치파일)
  • 패치 파일 저작권 정보 : 무료 프로그램/소스 포함(zlib license)
  • 버전 : NSIS 2.x용 한글 패치
  • 날자 : 2006/04/16
  • 주의 : NSIS 2.x를 먼저 설치한후 설치하여야 합니다.
구버전용
  • 받기 : NSIS206P.EXE(235KB) NSIS205P.EXE(238KB) NSIS 2.01용, 2004/10/05(230KB) (설치파일)
    예제 파일
    • 예제 파일 : nsissample.zip(53KB)
    • 예제 파일 저작권 정보 : 무료 프로그램/소스 포함(zlib license)
    • 날자 : 2004/10/05
    • 주의 : NSIS 2.x 와 위의 한글 패치가 설치되어 있어야 합니다.
    관련 페이지
    문서 정보
    • 문서위치 : http://www.kipple.pe.kr/doc/nsis/
    • 2004/10/06 : 최초 작성
    • 2004/10/08 : 질문과답 추가
    • 2005/03/06 : NSIS 2.05 용으로 맞추어서 자잘한 업데이트, AlwaysOnTop 플러그인 추가
    • 2005/04/03 : NSIS 2.06 으로 업데이트
    • 2006/04/16 : NSIS 2.x 모든 버전용으로 업데이트, nsis의 컴파일방법이 복잡해져서 이제 수정된 lang.h 와 makensis.exe는 제공되지 않고, 그냥 수정된 플러그인만 제공됩니다. 따라서 NSIS2.X 전 버전에 설치해서 사용하여도 문제가 없습니다.
    NSIS 소개

    NSIS 는 Nullsoft Scriptable Install System의 약자로, Winamp를 만든 NullSoft에서 Winamp용 설치프로그램을 만들기 위해서 제작되었다가, 나중에 오픈소스 형태(zlib 라이센스)로 공개된 설치프로그램 입니다. 물론 사용에 아무런 제한이 없으며 상업적으로 사용하여도 됩니다.


  • NSIS 를 다른 설치 프로그램과 비교하였을때 눈에 띄는 장점을 정리하자면...

    작은 크기

    설치파일의 오버헤드가 단지 50kb 정도 밖에 나지 않습니다. 단순히 압축 프로그램으로 압축한 파일과 비교하였을때 설치파일의 크기가 50kb 정도만 더 크다는 의미입니다. 프로그램을 배포할때 굳이 크기 때문에 zip 으로 묶어서 배포할 이유가 없어집니다.

    최고의 압축율

    NSIS 는 기본적으로 zip/bzip2/lzma압축 방식을 지원합니다. 여기서 주목할만한 점은 lzma를 지원한다는 것인데, lzma는 7-zip으로 알려진 압축방식으로 현존하는 방식중 최고의 압축율을 자랑하는 압축방식 입니다. 개인적으로 테스트해본 결과 zip 에 비해서 보통 30% 이상 파일의 크기가 줄어들며, winrar 의 solid 압축과 비교해도 더 좋은 압축율을 보여줬습니다. 이런 압축방식을 설치파일에 사용하게 되면 다른 설치프로그램 보다 월등하게 작은 크기의 설치파일을 만들어 낼 수 있습니다.

    스크립트 지원

    그다지 보기 좋지는 않지만, 강력한 자체 스크립트를 지원합니다. 별도의 플러그인을 만들어서 설치 스크립트에서 호출하는 것도 가능합니다. 다른 간단한 GUI 방식의 설치프로그램은 이러한 기능을 지원하지 않습니다.

    다국어 지원

    NSIS 2.0 에서는 다국어 버전을 지원해서 설치파일 하나로 여러가지 언어를 지원하는게 가능합니다만... 꽤 사용하기 복잡합니다.

    기타

    이것 이외에도 홈페이지에는 여러가지 장점이 나열되어 있지만, 작은 크기 만으로도 선택의 이유로 충분할듯 합니다.


    하지만 NSIS 에도 몇가지 단점이 있습니다.

    스크립트를 배워야 한다

    세상에 공짜가 없기때문에 스크립트를 배워야 합니다. HM NIS EDIT 같은 스크립트 생성 및 편집툴을 별도로 쓸 수도 있습니다만, 이것보다는 아래에 소개될 예제 소스를 변경하여서 사용하는 방식을 추천 합니다.
    ( 초기 스크립트 생성은 편한듯 보이지만, 설치파일의 유지보수에 그다지 적합치 않습니다. )

    한글처리의 문제

    NSIS 는 다국어 문제를 거의 완벽하게 지원하지만, 프로그램 설치시 을/를 이라던가 이/가 문제가 발생합니다. 이외에 다이알로그의 LDU 문제로 MODERN UI 사용시 이미지가 늘어져 보이는 문제도 발생합니다. 이 문서에서 제공하는 패치 파일과 샘플 파일은 이에 대한 해결 방법을 제공합니다.

    NSIS 예제 파일

    NSIS 의 예제 파일과 각각의 부분에 대해서 설명합니다. 이 예제 파일은 반드시 위에 있는 NSIS 패치를 설치하여야만 정상적으로 사용이 가능합니다.




    테스트 하기

    예제 파일의 압축을 풀고 __make.bat 파일을 실행하면



    NOTEPADSETUP.EXE 라는 예제 설치 파일이 생성됩니다. 이제 이 설치파일로 메모장을 설치하고, 제거하는걸 테스트 할 수 있습니다.







    기본 설정 : 언어 종속

    다국어 처리를 위해서 분리된 부분이다. 한글로 적는다.







    한글 특화

    한글처리 (을/를, 이/가 문제) 를 위해서 설정하는 부분이다. 자신의 프로그램에 맞게 이/가 를 설정한다. 반드시, 패치가 설치되어 있어야 정상 작동한다.






    기본 설정 : 언어 비종속

    설치에 관련되 화면에 보이지 않는 기본적인 정보를 설정한다. 가급적 영어로 적도록 한다. ( 설치 폴더와 같은 부분들.. )






    파일 복사

    설치시 파일을 복사하는 부분이다. 마찬가지로 Function un.My_Uninstall 부분에는 파일을 삭제하는 코드가 들어가야 한다.






    기타

    나머지는 소스의 주석 참고.

    NSIS 패치

    이 파일은 NSIS 를 좀더 편하게 쓰기 위해서 이것저것 패치한 파일입니다.
    특히 한글의 을/를,이/가 처리를 위해서 일부 파일이 수정되었고, 이 문서의 예제 파일은 이 문제를 해결하기위한 방법을 보여줍니다.
    패치파일을 설치하면, 기존에 설치된 NSIS 를 자동으로 패치하며, 패치파일의 소스는 NSIS\_patch_ 폴더에 같이 복사됩니다.
    다음은 패치되는 내용을 정리한 것입니다.

    advsplash.c

    • advsplash.c : 밀레니엄 계열에서 이상작동 버그 수정
    • advsplash.dll : 수정된후 컴파일된 플러그인

    lang.h

    • ※2006/04/16 수정, 이제 수정된 lang.h makensis.exe 는 제공되지 않음.
    • lang.h : exehead 에 있는 파일. 설치 파일 손상시 오류 메시지를 영어 + 한글로 나오도록 수정
    • makensis.exe : 수정된후 컴파일된 실행 파일



    NSISAutoSetupPlugin

    • NSISAutoSetupPlugin\ : /A 옵션으로 자동으로 설치될수 있도록 해주는 플러그인
    • NSISAutoSetupPlugin.dll : 컴파일된 플러그인

    win-k.bmp

    • win-k.bmp : "${NSISDIR}\Contrib\Graphics\header\win-k.bmp" 에 위치, 기존의 win.bmp 는 한글 윈도우에서 늘어나 보이므로, 대신 이 파일을 사용하면 늘어나 보이지 않는다.
    • 이런 방식으로 사용한다.

    !define MUI_HEADERIMAGE ; HEADER 비트맵 보일까 말까 여부.
    !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\header\win-k.bmp"



    레지스트리 변경

    • .nsi 파일을 더블클릭하면 메모장으로 편집되는 대신 makensis 로 바로 컴파일 되도록 수정
    • 컴파일후 /PAUSE 옵션으로 화면에 결과를 볼수 있도록 수정
    • NSIS가 있는 폴더를 PATH 환경변수에 추가해서 makensis 를 바로 실행 가능하도록 수정

    한글 문제 해결

    • 한글 문제를 해결하기 위해서 Korean-eul.nlf, Korean-rul.nlf 가 추가되었고, Korean.nsh 가 수정되었음.
    • 사용법은 이 문서의 "한글 특화" 부분 참고

    질문과 답

    실행중인 프로그램 종료시키기

    새버전의 프로그램을 설치할때나, 프로그램을 제거할때 기존의 프로그램이 실행중이면 이 프로그램을 종료할 필요가 생깁니다. 이때 프로그램을 죽이거나(Kill) 종료(Close) 시킬수가 있는데, 이 문서의 예제에서는 다음과 같은 방법을 사용합니다.

    ; 함수 선언부
    ;
    ;----------------------------------------------------------------------------------------
    ; 프로그램의 클래스를 이용하여서 프로그램이 실행중인지 체크하고, 종료시킨다.
    ; 호출전 Push 로 꼭 함수 이름을 보내줘야 한다.
    Function CheckAndCloseApp 
    Pop    $R0                    ; GET WINDOW CLASS NAME
    loop1: 
       FindWindow $R1 "$R0"
       IntCmp $R1 0 done1
       SendMessage $R1 16 0 0 ; WM_CLOSE
       SendMessage $R1 2 0 0  ; WM_DESTROY
       Sleep 3000
       FindWindow $R1 "$R0"
       IntCmp $R1 0 done1
       MessageBox MB_OK "$(TXT_NAME)${I_KA} $(TXT_STILLRUN_EXIT_PROGRAM)"
       goto loop1
    done1:
    FunctionEnd
    --------------------------------------------------------------------------------
    ; 사용할때는 
    Push "Notepad"
    Call CheckAndCloseApp 

    이 방법은 윈도우의 클래스(Class) 명을 가지고 윈도우의 핸들을 찾아서 종료메시지(WM_CLOSE) 를 보내는 방식을 사용한다.
    윈도우의 클래스는 윈도우의 속성과 관련된 부분이다. 예를 들자면 버튼 윈도우의 클래스명은 "Button" 이다. 어떠한 프로그램의 클래스명을 알고 싶다면 SPY++ 라는 프로그램으로 확인이 가능하다. 메모장의 클래스 이름은 스파이로 확인한 결과 "Notepad" 이였다.

    만일 프로그램이 MFC 로 작성되어서 윈도우의 클래스가 Afx:xxxx 와 같이 매번 바뀐다면 FindWindow 함수에서 클래스명 대신 타이틀을 이용해서 검색하는것도 가능하다. (하지만 타이틀도 매번 바뀐다면? OTL)

    OS 의 종류에 따라서 다른 프로그램 설치하기

    레지스트리의 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion 항목을 검사해서 NT계열(NT/2000/XP/2003) 계열인지 아닌지(95/98/ME) 확인이 가능하다.
    다음은 꿀뷰에서 유니코드 버전과 아스키 버전을 설치할때 사용하고 있는 스크립트의 예제 이다.


    ReadRegStr $R0 HKLM  "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
    IfErrors NotNT
    File /oname=HoneyView.exe HoneyViewU.exe 
    goto NEXT
    NotNT:
    File HoneyView.exe
    NEXT:

    Posted by theYoungman
    engineering/System Eng.2007. 3. 6. 19:40
    출처 : http://www.cipher.pe.kr/tt/cipher/107



    NSIS 로 인스톨러를 만들면 각각의 페이지를 만드는 것이다. 각 페이지가 모여서 전체적인 인스톨 프로그램을 구성하게 된다. 주로 많이 접하는 페이지가 라이센스 동의에 대한 페이지나 인스톨할 디렉토리 선택등을 알 수 있다. 물론 사용자 구성/작성 페이지를 추가 할 수도 있다. 스크립트를 사용해서 이런 페이지의 순서를 변경할 수도 있으며, 특정한 정보를 제공할때 한 페이지에만 머무르도록 할 수도 있다.

    페이지에 관련된 기본적인 명령어는 Page, UninstPage 이다. 첫번째 명령어는 페이지를 인스톨 프로그램에 추가하는 것이고, 두번째는 언인스톨 프로그램에 페이지를 추가하는 것이다. 또 다른 명령어로는 PageEx 가 있다. Ex가 의미하는바가 Extension을 의미하는 것이므로 Page 명령어 보다 더 자세하게 셋팅을 할 경우 사용하는 명령어 이다.

    1. 페이지 순서

    페이지 순서는 스크립트에서 Page, UninstPage, PageEx 가 나타나는 순서대로 페이지가 실제로 보여지게 된다. 예를 들어

    1. Page license
    2. Page components
    3. Page directory
    4. Page instfiles
    5. UninstPage uninstConfirm
    6. UnistPage instfiles


    위의 코드를 이해해 보자면, 인스톨 프로그램에서 제일 먼저 라이센스 관련된 페이지, 컴포넌트 선택하는 페이지, 인스톨 디렉토리 선택 페이지, 마지막으로 인스톨 로그를 보여주는 페이지를 보여 주라는 얘기이다. 그리고 언인스톨 프로그램에서 처음에는 언인스톨 할건지 확인하는 페이지를 보여 주고, 마지막으로 언인스톨 되는 파일에 대한 로그를 보여 주라는 얘기이다.

    NSIS 스크립트에서 예전 버전과의 호환성 때문에 Page 명령어가 없을 경우 license, components, directory, instfiles등이 자동으로 포함된다. 물론 각 페이지를 만들기 위한 정보가 제공될 경우 이다. license의 경우 LicenseText와 LicenseData가 지정되어 있어야 하며, directory 페이지의 경우 DirText가 지정되어 있어야 하는 등을 말한다.

    2. 페이지 옵션

    각 페이지는 페이지를 포함하기 위한 각각의 정보를 필요로 한다.

    License page

    1. LicenseText [text [button_text] ]

    - text에 적히는 내용이 페이지 위쪽에 라이센스 아이콘 옆에 적히는 글이다. [button_text] 의 경우 라이센스 동의 시에 누르는 "I Agree" 대신에 쓰여질 글을 적는 부분이다.
    1. LicenseData (txt|rtf)

    - 라이센스에 사용할 파일을 표시한다. 이 데이타가 없는 경우 라이센스 페이지는 표시되지 않는다. 만약 각 언어마다 다른 라이센스 파일을 추가 하고자 할때는 LicenseLangString 을 이용한다. LicenseLangString은 다중 언어 설명에서 더 자세하게 설명하겠다.
    1. LicenseForceSelection (checkbox [accept_text] | radiobuttons [accept_text] [decline_text] | <b>off</b>)

    - 라이센스에 동의하겠다는 라디오 버튼이나 체크 박스를 표시하여서 선택하지 않으면 "next" 버튼을 활성화 시키지 않는 옵션이다.

    단순히 설명만 보면 잘 모를 수도 있으니 아래와 같은 스크립트를 작성하여서 컴파일하여 실행시켜 보자. 아래 그림과 같이 창이 나오게 된다. Page에 대한 내용을 적어 주지 않아도 디폴트로 라이센스 페이지가 가장 먼저 나오므로 아래와 같이 된다. 아래 코드를 보면 위에 설명한 내용이 어떤 내용을 말하는지 이해가 될것이다. LicenseForceSelection 에서 "위 라이센스에 동의 합니다"와 같이 사용자가 글을 직접 쓸 수도 있고, "" 라고 쓰면 디폴트 값이 쓰여지게 된다. 하나 생각할 것은 license.dat 파일에서 http로 주소를 적으면 자동으로 하이퍼링크가 걸려서 라이센스 파일에서 보여 준다는 것이다.

    1. # set the name of the installer
    2. outfile "pages.exe"
    3. # set license data file
    4. LicenseText "라이센스 동의해 주세요~~~ " "동의"
    5. LicenseData ".\license.txt"
    6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
    7. # create a default section.
    8. section
    9. sectionEnd

    사용자 삽입 이미지



    Component selection page
    1. ComponentText [text [subtext] [subtext2]]

    - 컴포넌트 페이지에 쓰여지는 디폴트 글을 바꾸는 옵션이다.
      text : 인스톨 아이콘 옆에 쓰여지는 글 이다. 일종의 제목 글로 생각하면 되겠다.
      subtext : 인스톨 타입 선택 옆에 쓰여지는 글이다.
      subtext2 : 인스톨 타입 아래에 쓰여지는 글이다.
    여기에 쓰이는 텍스트는 변수 형태로 미리 써서 포함 시킬 수도 있다. 이해 하기가 어려우니 위에 쓴 코드를 확장해서 아래와 같이 만들어서 사용해 보자. 컴포넌트는 Section의 개념이 포함되므로 일단 여기서는 어떻게 쓰는지만 보고 Section의 내용을 보고 전체적으로 다시 만들어 보자.

    1. # set the name of the installer
    2. outfile "pages.exe"
    3. LicenseText "라이센스 동의해 주세요~~~ " "동의"
    4. # set license data file
    5. LicenseData ".\license.txt"
    6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
    7. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
    8.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
    9. # create a default section.
    10. section
    11. sectionEnd
    12. section "Component1"
    13.         MessageBox MB_OK "You select component1"
    14. SectionEnd
    15. Section "Component2"
    16.         MessageBox MB_OK "You select component2"
    17. SectionEnd

    사용자 삽입 이미지

    위의 코드와 실행했을때 나오는 화면을 보면 각각이 어떤 역활을 하는지 충분히 이해 할 수 있을 것이다.


    Directory selection page

    1. DirText [text] [subtext] [browse_button_text] [browse_dlg_text]

    - 인스톨할 디렉토리를 선택하는 페이지를 포함할 경우 그 디렉토를 셋팅하는 페이지에 대한 옵션을 줄 수 있다.
      text : 인스톨 아이콘 옆에 쓰여지는 제목이라고 볼 수 있다.
      subtext : 디렉토리 선택 페이지에 보여지는 글이다.
      browse_button_text : 다른 디렉토리를 선택할때 클릭하는 버튼에 적히는 텍스트 이다.
      browse_dlg_text : 다른 디렉토리를 선택하기 위해 버튼을 클릭한 후 나온 다이얼로그에 적히는 글이다.
    디폴트 값을 이용하고자 할 경우에는 "" 로 자리를 차지하면 되겠다. 글을 보면 좀 이해하기가 힘들겠지만, 코드와 함께 실행된 화면을 보면 이해할 거라고 생각한다.

    1. # set the name of the installer
    2. outfile "pages.exe"
    3. LicenseText "라이센스 동의해 주세요~~~ " "동의"
    4. # set license data file
    5. LicenseData ".\license.txt"
    6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
    7. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
    8.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
    9. DirText "인스톨 할 디렉토리 선택 창입니다." "본 프로그램을 인스톨 할 디렉토리를 선택해 주십시오." \
    10.         "클릭해줘!" "디렉토리 선택하는 다이얼로그 설명입니다."
    11. # create a default section.
    12. section
    13. sectionEnd
    14. section "Component1"
    15.         MessageBox MB_OK "You select component1"
    16. SectionEnd
    17. Section "Component2"
    18.         MessageBox MB_OK "You select component2"
    19. SectionEnd


    위 스크립트를 컴파일하고 실행한 후, 라이센스를 동의하고 컴포넌트 선택하고 나면 아래와 같이 디렉토리 선택하는 윈도우가 나오고, "클릭해줘!" 라는 버튼을 클릭하면 실제로 디렉토리를 선택할 수 있는 창이 나온다. 위 코드에서 사용한 문자열과 실제로 어떻게 화면에 출력되는지 확인을 해보면 되겠다.
    사용자 삽입 이미지


    1. DirVar user_var

    - 일반적으로 디렉토리를 선택할 경우에 $INSTDIR에 그 값이 저장된다. 만약 사용자가 선택한 폴더와 디폴트 폴더 모두 사용하고자 하면 이 명령어를 써서 사용자가 선택한 변수에 선택한 디렉토리를 저장할 수 있게 된다. 이 명령어는 반드시 PageEx 내에서만 사용해야 한다. 예제는 밑에 있는 한 가지 옵션을 더 보고 동시에 셋팅한 예제를 보겠다.

    1. DirVerify auto|leave

    - 이 명령어는 기본적으로 사용하지 않아도 auto로 셋팅되어 있다. 이 옵션은 인스톨 할 디렉토리가 제대로 되어 있지 않던가, 디스크에 프로그램을 인스톨 할 여유 공간이 없을 경우 next 버튼이 활성화되지 않게 된다. 하지만 이 명령어를 사용해서 leave로 하게 되면 이러한 체크에 상관없이 항상 next 버튼이 활성화 되게 된다. 일반적으로는 사용할 필요가 없는 그런 옵션이다.

    아래 예제 코드를 살펴 보자. 이제 코드가 좀 복잡해 진것 처럼 보이지만, 앞의 코드를 약간 수정한 내용이다. 먼저 봐야 할 부분이 19째 줄부터 보면 PageEx~PageExEnd 가 있다. DirVar의 기능을 보여 주기 전에 먼저 보여 줄것이 있어서 코드 자체를 주석 처리해 놓았다. 6번째 줄을 보면 InstallDir 명령어가 있는데, 이 명령어는 $INSTDIR에 문자열을 포함시키는 역할을 한다. 디폴트로 여기로 인스톨 하겠다는 디렉토리를 정하는 명령어 이다. 아래의 코드를 실행 시키면 인스톨 디렉토리를 선택하는 부분에 6번째 줄에 있는 디렉토리로 디폴트 값이 저장되게 된다. 디렉토리 페이지에서 이 디폴트 값을 보여 주는 역할을 한다. 아래 그림과 같이 나오게 된다. PageEx 명령어를 쓰게 되면 디폴트로 license 페이지부터 보여 주던 것을 더 이상 보여 주지 않고 directory 페이지만 보여 주므로 명시적으로 라이센스부터 끝까지 페이지를 보여 주기 위해서 17번째 줄에서 22번째 줄까지 직접 page 를 삽입했다. 앞에서 봤듯이 이 페이지의 순서는 적혀 있는 순서이므로 나중에 순서를 바꾸어서 한번 테스트 해보기 바란다.
    1. # set the name of the installer
    2. outfile "pages.exe"
    3. Var ANOTHER_DIR
    4. InstallDir "$PROGRAMFILES\testing"
    5. LicenseText "라이센스 동의해 주세요~~~ " "동의"
    6. # set license data file
    7. LicenseData ".\license.txt"
    8. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
    9. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
    10.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
    11. DirText "인스톨 할 디렉토리 선택 창입니다." "본 프로그램을 인스톨 할 디렉토리를 선택해 주십시오." \
    12.         "클릭해줘!" "디렉토리 선택하는 다이얼로그 설명입니다."
    13. Page License
    14. Page Components
    15. PageEx directory
    16. #       DirVar $ANOTHER_DIR
    17. PageExEnd
    18. Page instfiles
    19. # create a default section.
    20. section
    21. MessageBox MB_OK "$INSTDIR" # , $ANOTHER_DIR"
    22. sectionEnd
    23. section "Component1"
    24.         MessageBox MB_OK "You select component1"
    25. SectionEnd
    26. Section "Component2"
    27.         MessageBox MB_OK "You select component2"
    28. SectionEnd


    사용자 삽입 이미지


    DirVar 의 기능을 보기 위해서 먼저 아래 코드에서 20번째줄에 있는 주석 표시를 지우고, 28번째 줄을 [code type=nsis]MessageBox MB_OK "$INSTDIR, $ANOTHER_DIR"[/CODE] 로 변경해 보자. 실행시키면 directory 페이지에 디폴트 값이 나오지 않는 것을 알 수 있을 것이다. 그리고 디렉토리를 아무거나 선택해 보면 창에 적히는 것이 선택한 디렉토리\testing 으로 나오는 것을 알 수 있을 것이다. 그리고 "Install" 버튼을 클릭해 보면 아래 그림과 같이 $INSTDIR과 $ANOTHER_DIR 모두 다른 값을 가짐을 알 수 있다.
    사용자 삽입 이미지

    여기서 문제는 디렉토리 페이지에 디폴트 값이 표시 되지 않는 것인데, 이는 DirVar로 선택한 $ANOTHER_DIR가 초기 값을 아무것도 안 가지기 때문이다. 여기에 디폴트 값을 뭔가 주면 되겠다. 어떻게 하면 되는지 한번 고민해 보기 바란다. 간단하게 $ANOTHER_DIR의 초기화를 PageEx~PageExEnd 안에 두면 되지 않겠느냐고 생각할 수도 있지만, PageEx~PageExEnd 안에는 StrCpy 명령어를 쓸 수 없다.

    1. function .onInit
    2.        StrCpy $ANOTHER_DIR "$WINDIR"
    3. functionEnd


    위 코드를 그 위에 있는 코드 23번째줄에 삽입하고 실행하면 원하는 데로 되는 것을 알 수 있을 것이다. function에 대해서는 아직 배우지 않았으므로 여기서는 .onInit 에서 필요한 초기화를 해주면 된다는 것만 알고 넘어 가자.

    1. DetailsButtonText [text]

    DetailsButtonText는 위에 전체 코드 중에서 22번째 줄에 있는 Page instfiles 대신에 아래 코드로 변경하고 컴파일을 하면 아래 창 처럼 버튼에 적히는 글의 내용이 달라 진다.
    1. CompletedText [text]

    CompletedText는 인스톨이 끝났을 경우 "Completed" 라는 것 말고 다른 말을 적을 때 사용한다.

    1. PageEx instfiles
    2.        DetailsButtonText "자세히 보여줘~~"
    3.        CompletedText "끝났당~~"
    4. PageExEnd

    사용자 삽입 이미지

    위에 있는 DetailsButtonText와 CompletedText는 모두 언인스톨 창에서도 사용할 수 있다. 또 한 DirVar도 마찬가지로 언인스톨시에 사용할 수 있다.

    페이지 옵션으로 마지막으로 남은것은 UninstallText가 남아 있다. 이 옵션은 나중에 언인스톨러를 공부할 때 실제로 보도록 하겠다.
    Posted by theYoungman