logo

한국어

NSIS 예제 코드 설명 - example2.nsi

관리자 2010.04.17 23:03 조회 수 : 394

이제 NSIS를 사용하는데 필요한 내용은 대부분 배웠다. 나머지 내용들은 인스톨 화면인 GUI를 어떻게 원하는 입맛대로 바꾸는지와 MUI(Modern User Interface) 부분이 남았는데, 이런 부분은 실제로 동작(인스톨/언인스톨 동작)을 하는 것들을 분석하고 실행해 보고 나서 뒤에 보기로 하겠다. 가능한 NSIS를 인스톨 했을때 같이 인스톨되는 예제 파일 중에서 분석할 만한 것들을 몇개 골라서 분석해 보겠다. 예제 코드 자체에 주석이 자세하게 적혀 있지만, 가능한 더 자세하게 분석할 것이다.

그럼 첫 번째로 분석할 예제는 example2.nsi 라는 파일이다. 코드는 아래와 같다.

  1. ; example2.nsi
  2. ;
  3. ; This script is based on example1.nsi, but it remember the directory,
  4. ; has uninstall support and (optionally) installs start menu shortcuts.
  5. ;
  6. ; It will install example2.nsi into a directory that the user selects,
  7.  
  8. ;--------------------------------
  9.  
  10. ; The name of the installer
  11. Name "Example2"
  12.  
  13. ; The file to write
  14. OutFile "example2.exe"
  15.  
  16. ; The default installation directory
  17. InstallDir $PROGRAMFILES\Example2
  18.  
  19. ; Registry key to check for directory (so if you install again, it will
  20. ; overwrite the old one automatically)
  21. InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir"
  22.  
  23. ;--------------------------------
  24.  
  25. ; Pages
  26.  
  27. Page components
  28. Page directory
  29. Page instfiles
  30.  
  31. UninstPage uninstConfirm
  32. UninstPage instfiles
  33.  
  34. ;--------------------------------
  35.  
  36. ; The stuff to install
  37. Section "Example2 (required)"
  38.  
  39.   SectionIn RO
  40.   ; Set output path to the installation directory.
  41.   SetOutPath $INSTDIR
  42.   ; Put file there
  43.   File "example2.nsi"
  44.   ; Write the installation path into the registry
  45.   WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR"
  46.   ; Write the uninstall keys for Windows
  47.   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2"
  48.   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"'
  49.   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1
  50.   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1
  51.   WriteUninstaller "uninstall.exe"
  52. SectionEnd
  53.  
  54. ; Optional section (can be disabled by the user)
  55. Section "Start Menu Shortcuts"
  56.  
  57.   CreateDirectory "$SMPROGRAMS\Example2"
  58.   CreateShortCut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  59.   CreateShortCut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi" "" "$INSTDIR\example2.nsi" 0
  60. SectionEnd
  61.  
  62. ;--------------------------------
  63.  
  64. ; Uninstaller
  65.  
  66. Section "Uninstall"
  67.   ; Remove registry keys
  68.   DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"
  69.   DeleteRegKey HKLM SOFTWARE\NSIS_Example2
  70.  
  71.   ; Remove files and uninstaller
  72.   Delete $INSTDIR\example2.nsi
  73.   Delete $INSTDIR\uninstall.exe
  74.  
  75.   ; Remove shortcuts, if any
  76.   Delete "$SMPROGRAMS\Example2\*.*"
  77.  
  78.   ; Remove directories used
  79.   RMDir "$SMPROGRAMS\Example2"
  80.   RMDir "$INSTDIR"
  81.  
  82. SectionEnd


예제 파일을 처음 분석하는 것이나 위에서 하나씩 분석해 보도록 하겠다. 

1~10줄 : 전부 주석이다. 나중을 위해서라도 이렇게 주석을 많이 달아 주는 것이 좋다.
11 : Name "Example2"는 인스톨러의 이름을 의미한다. 위 코드를 실행시켰을때 윈도우의 제일 위쪽 상단에 나오는 이름이다.
14 : 인스톨러가 저장되는 이름을 의미한다. 즉 실제로 exe 파일의 이름을 의미한다.
17 : InstallDir는 인스톨 디렉토리의 디폴값을 설정하는 명령어이다. 즉 그 다음에 있는 $PROGRAMFILES\Examples2 라고 하는 디렉토리를 디폴트 디렉토리로 선정하는 것이다. 여기서 $PROGRAMFILES는 앞에서 설명했듯이, 특별히 레지스트리를 손대지 않았으면 C:\Program Files\  디렉토리를 가르킨다. 즉 이 디렉토리 밑에 Examples2 라는 디렉토리를 디폴트 인스톨 디렉토리로 사용하겠다는 것이다.
21 : InstallDirRegKey 명령어는 레지스트리에 있는 문자열을 체크해서 만약 정상적인 경우 그 값을 인스톨 디렉토리에 사용하라는 명령어 이다. 이 명령어의 사용법에 따라 코드에 쓰여진 것을 분석해 보면 HKLM이란 HKEY_LOCAL_MACHILE을 뜻하므로 registry에서 HKEY_LOCAL_MACHINE\Software\NSIS_Example2 에서 Install_Dir의 값이 있는지를 확인하는 것이다. 처음 프로그램을 인스톨 할 경우 여기에 아무 값도 없으므로 17번째줄에서 지정한 인스톨 디렉토리 값을 사용한다. 48번째줄을 보면 이 값을 쓰는 것을 알 수 있다.

인스톨 완료후 레지스트리 에디터로 레지스트리에 저장된 내용을 보면 아래와 같이 인스톨러를 만들때 48번째 줄에서 명령한 레지스트리에 인스톨 디렉토리를 쓰고 있음을 보여 준다.


27~29 : Page 명령어를 사용해서 필요한 페이지만 직접 지정하고 있다. 여기서는 Component 선택 페이지와 인스톨 디렉토리 변경 페이지, 그리고 인스톨되는 파일들을 보여 주는 페이지를 보여 준다. 아래 이미지가 component선택 화면을 보여 준다. 여기서 첫번째 선택은 사용자가 선택을 바꿀수 없음을 보여 준다. 이는 아래 섹션 설명중에서 39번째 줄에 있는 명령어를 이용하는 것이다.

아래 화면을 보면 InstallDir이 디폴트 값으로 남아 있는 것을 볼 수 있다.

31~32 : 언인스톨시에 보여주는 페이지를 지정하고 있다. 언인스톨에 대한 확인을 하는 페이지와 실제로 언인스톨하는 페이지를 보여 준다.
37~57 : 첫번째 component를 선택했을때 인스톨 될 내용을 포함하고 있다. Page 명령어로 Component 페이지를 보여 주므로 37번째 줄에서 보듯이 Section에 이름을 주었을때 그 이름이 Component 선택 페이지에 나오게 된다.
39 : SectionIn의 경우 인스톨 타입을 결정하는 InstType 명령과 함께 쓰이면 어느 인스톨 타입에 포함되는지 인덱스로 표시하게 된다. 여기서는 R0를 파라메타로 사용하고 있는데, 이럴 경우 현재 섹션은 읽기 전용으로 되면서 사용자가 결코 해제 하지 못하게 Component 페이지에 보이게 된다. 디폴트로 무조건 인스톨 해야 하는 component는 여기서 처럼 사용하면 된다.
42 : SetOutPath 는 그 다음에 나오는 File 명령어에서 사용한다고 보면 된다.
45 : File 명령어는 SetOutPath에서 지정한 디렉토리에 File 다음에 있는 파일을 인스톨 하게 된다. 여기서 File 다음에 있는 파일은 현재 nsi 파일이 있는 디렉토리에서 상대 경로로 많이 사용한다. 코드를 보면 현재 같은 디렉토리에 있는 exaple2.nsi 파일을 말한다. 절대 경로로 다른 경로에 있는 파일도 포함할 수 있다. File 명령어는 다른 여러가지 옵션이 있으므로 메뉴얼을 참조하는 것도 좋은 방법이다. *.exe 와 같은 경우도 사용가능하다.
48 :  WriteRegStr은 레지스트리에 값을 쓰는 명령어이다. 같은 프로그램을 모르고 두 번 인스톨 할 경우 이전에 인스톨한 디렉토리를 지정하는 방법으로 많이 사용하는 방법인데, 21번째줄에 있는 InstallDirRegKey에서 읽을 값을 여기서 적어 준다.
51~54 : 제어판에 있는 "프로그램 추가/제거"를 클릭했을때 언인스톨 할 수 있는 정보를 적어 주는 부분이다. 나중에 다른 인스톨 프로그램을 만들때도 이 부분은 마지막 value 값을 빼고 항상 같이 사용할 내용이다. WriteRegStr과 WriteRegDWORD는 레지스트리에 값을 쓸 때 문자열로 쓰는 것이 있고, DWORD 형태로 쓰는게 있는데 거기에 맞추어서 함수를 사용하면 된다. 프로그램 추가/제거 화면을 보면 아래와 같이 나와 있음을 알 수 있다.

60~66 : Component 페이지에서 옵션으로 선택/해제 할 수 있는 component에 대한 정보를 담고 있는 섹션이다. 인스톨시 이 섹션 부분을 체크했으면, 시작 메뉴에 아래와 같이 생성된다.

62 : CreateDirectory는 말 그대로 디렉토리를 만드는 명령어 이다. 여기서  $SMPROGRAMS는 Start Menu가 저장되어 있는 디렉토리이다. 즉 시작 메뉴가 저장되어 있는 디렉토리이고, 여기에 Examples2 라는 폴더를 하나 만드느므로 시작메뉴에 Examples2라는 메뉴를 만드는 것이다.
63 ~ 64 : CreateShortCut 은 쇼컷 메뉴를 만드는 명령어이다. 시작 메뉴안에 쇼컷을 만들때 쓰는 명령어이다.
72 ~ 89 : 언인스톨러에서 사용하는 섹션이다. 섹션의 이름에 "Uninstall"이라고 하면 된다.

75 : DeleteRegKey는 저장되어 있는 레지스트를 지우는 명령어이다.
79 ~ 80 : 인스톨 했던 파일을 지우는 명령이며, 언인스톨러인 uninstall.exe도 지우게 된다. 프로그램이 실행중에는 실행파일을 지울수 없지만, 원래 언인스톨러는 실행되면 윈도우의 temp 디렉토리로 복사되어서 실행된다. 때문에 인스톨 된 디렉토리에 있는 언인스톨러를 지울 수가 있다.
83 : 쇼컷을 지운다.
86 ~ 87 : 디렉토리 자체를 지운다.

언인스톨이 끝난 후에는 아래와 같은 화면이 나오게 된다.