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.kippler.com/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: