logo

한국어

NSIS-Variables

관리자 2010.04.17 23:06 조회 수 : 28

1. 변수란?

NSIS에서 변수는 항상 전역적인 범위를 가진다. 즉 지역 변수라는게 없다는 얘기다. 그리고 변수명의 길이는 최대 1024 로 제한된다. 이 보다 큰 길이의 변수명이 필요하면 NSIS 소스를 새로 빌드하면 된다. 하지만 일반인이 이 보다 긴 길이의 이름을 쓴다는 것은 의미가 없다. 10자 이상만 길어져도 타이핑 하기가 귀찮은데 말이다... ㅋㅋㅋ

사용자가 변수를 선언할때는 Var 이라는 명령어와 함께 쓰면 된다. 이러한 변수는 값이나 문자열을 저장하는데 사용할 수 있다.

  1.  
  2.  Var [/GLOBAL] var_name
  3.  


변수는 위와 같은 방식으로 선언할 수 있다. 이때 변수의 이름으로 사용가능한 문자는 [a-z][A-Z][0-9], '-' 를 사용할 수 있다. 모든 변수는 전역 변수라서 function이나 section 내에서 선언한 변수도 모두 전역으로 여겨 진다. 이때 /GLOBAL 스위치를 꼭 명시적으로 표시해야 한다. 그 이외의 위치에서는 /GLOBAL 스위치를 사용할 필요는 없다.

  1.  
  2. Var example
  3.  
  4. function .onInit
  5.   Var /GLOBAL testing
  6.  
  7.   StrCpy $example "Hello World"
  8.   StrCpy $testing "This is testing"
  9. functionend
  10.  


위와 같은 경우 변수를 선언시에는 '$'를 사용하지 않지만, 실제로 변수를 사용할 경우 항상 '$'로 시작해야 한다.

2. 수정 가능한 미리 지정된 변수들

  2.1. 유저가 선언한 변수와 거의 같은 용도로 사용할 수 있는 변수들

NSIS에는 미리 지정된 변수들이 있다. 이러한 미리 지정된 변수들 중에 변수의 값을 변경 가능한 것들 중에 Registers 라고 해서 유저가 선언한 변수랑 똑같이 쓰지만, 선언할 필요가 없는 변수가 있다. 유저가 선언한 변수랑 또 다른 점은 이 변수들은 plug-in DLL과 값이나 문자열을 주고 받는데 사용할 수가 있다는 것이다. 때문에 이런 변수를 사용할때는 항상 stack에  push 작업을 하고 다 사용한 이후에는 항상 pop하여 원래 값으로 돌려 주는 것을 잊지 말아야 한다.

  1.  
  2. $0 ~ $9, $R0 ~ $R9
  3.  


  2.2. 변수 이름이 이미 지정되어서 의미를 가지고 있어서 인스톨에 영향을 주는 변수들
  1.  
  2. $INSTDIR ; 인스톨 하기 위한 디렉토리 설정, 값을 변경하고자 하면 StrCpy, ReadRegStr 등등을 사용함
  3.    ; 보통 .onInit 함수에서 인스톨 디렉토리를 좀 더 세밀하게 셋팅하고자 할 때 사용함.
  4.    ; unistaller 에서는 uninstaller가 인스톨 된 디렉토리를 표시한다. 즉 프로그램을
  5.    ; 인스톨한 디렉토리와 uninstaller가 인스톨 된 디렉토리가 다를 경우 상황에 따라 다른 값을 가진다
  6.  
  7. $OUTDIR ; 현재 만들고 있는 인스톨 프로그램이 저장될 위치를 표시한다.
  8.    ; SetOutPath 나 StrCpy, ReadRegStr 등등을 이용해서 값을 변경할 수 있다.
  9.  
  10. $CMDLINE ; 인스톨 프로그램을 실행했을때 파라메터를 넘겨 줬을때 그 값을 가진다.
  11.    ; 마지막에 코드로 보여 주면 좀 더 이해가 쉬울 것이다.
  12.    ; 이 문자열을 parsing하고자 하면 GetParameters를 이용하면 된다.
  13.  
  14. $LANGUAGE ; 현재 사용하고 있는 언어에 대한 인식을 위한 숫자가 들어 있다.
  15.  


3. 상수들

윈도우 OS의 환경으로 부터 값을 가지고 있기 때문에 사용자가 수정할 수가 없다. 예를 들어 각각의 OS에서 프로그램을 인스톨하는 기본적인 디렉토리는 ...\Program Files 밑이지만, 윈도우의 레지스트리를 수정하여 기본 인스톨 디렉토리를 변경할 수도 있다. 이럴 경우 그 값을 인스톨 프로그램이 자동으로 감지하여 상수에 값을 저장하는 것이다. 여기에 나오는 모든 상수들이 모든 윈도우 OS에서 값을 가지는 것은 아니다. $CDBURN_AREA 와 같은 변수는 Windows XP 이후 버전에서만 의미가 있다. 특별히 언급하지 않는 상수들은 모든 Windows OS에서 동작한다고 보면 된다.

  1.  
  2. $PROGRAMFILES ; 기본적인 프로그램 인스톨 디렉토리. 이 값은 실제 인스톨 프로그램 실행시에 체크 된다.
  3.  
  4. $COMMONFILES ; common 파일들이 들어 있는 디렉토리. 보통 C:\Program Files\Common Files 이지만
  5.    ; 실제로 인스톨 프로그램 실행시에 체크 된다.
  6.  
  7. $DESKTOP ; 윈도우 데스크탑에 있는 파일이나 아이콘등이 저장된 디렉토리이다.
  8.    ; 보통 C:\windows\desktop 이다. 이 값은 SetShellVarContext 셋팅
  9.    ; (컴퓨터 사용하는 모든 유저 또는 현재 유저)에 따라서 다른 값을 가질 수 있다.
  10.    ; 디폴트 값은 현재 유저 이다.
  11.  
  12. $EXEDIR ; 인스톨 실행 파일이 저장된 디렉토리를 표시한다.
  13.  
  14. ${NSISDIR} ; NSIS가 인스톨 된 디렉토리를 표시한다. NSIS 디렉토리안에 있는 Icons 나 UIs 폴더 안에
  15.    ; 있는 리소스 등을 사용할때 유용하게 사용할 수 있다.
  16.  
  17. $WINDIR ; 윈도우즈 디렉토리를 나타낸다. 보통 C:\windows 또는  C:\winnt 이다.
  18.  
  19. $SYSDIR ; 윈도우즈 시스템 디렉토리를 나타낸다. c:\windows\system 이다.
  20.  
  21. $TEMP ; 시스템의 temporary 디렉토리를 나타낸다
  22.  
  23. $STARTMENU ; 시작(Start) 메뉴 폴더 이다. $DESKTOP 과 같이
  24.    ; SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  25.  
  26. $SMPROGRAMS ; 시작(Start) 메뉴 프로그램 폴더를 나타낸다.
  27.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  28.  
  29. $SMSTARTUP ; 시작(Start) 메뉴 프로그램 내부에 있는 시작프로그램 폴더를 표시한다.
  30.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  31.  
  32. $QUICKLAUNCH ; 빠른 시작(Quick Launch) 폴더를 나타낸다. 만약 사용자의 데스크 탑에서
  33.    ; 빠른 시작 을 사용하지 않으면, $TEMP와 같은 값을 나타낸다.
  34.  
  35. $DOCUMENTS ; 내 문서 폴더를 나타낸다.
  36.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  37.  
  38. $SENDTO ; 컨텍스트 메뉴(마우스 오른쪽 클릭)에서 보내기에 들어 있는 내용을 저장하는 폴더를 나타낸다.
  39.  
  40. $RECENT ; 시작(Start) 메뉴에서 문서 메뉴 안에 있는 숏컷을 저장하고 있는 폴더를 나타낸다.
  41.  
  42. $FAVORITES ; 사용자의 즐겨찾기 내용을 저장하고 있는 폴더를 나타낸다.
  43.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  44.  
  45. $MUSIC ; 사용자의 내 음악 폴더를 나타낸다.
  46.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  47.  
  48. $PICTURES ; 사용자의 내 그림 폴더를 나타낸다.
  49.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  50.  
  51. $VIDEOS ; 사용자의 내 비디오 폴더를 나타낸다.
  52.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  53.  
  54. $NETHOOD ; 내 네트워크 환경 에 대한 객체를 저장하고 있는 폴더를 나타낸다.
  55.  
  56. $FONT ; 시스템의 폰트 폴더를 나타낸다.
  57.  
  58. $TEMPLATES ; 문서 템플릿 폴더를 나타낸다.
  59.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  60.  
  61. $APPDATA ; 응용 프로그램의 데이타 폴더를 나타낸다.
  62.    ;  SetShellVarContext 셋팅으로 다른 값을 가질 수 있다. 디폴트 값은 현재 유저이다.
  63.  
  64. $LOCALAPPDATA ; 로컬 응용 프로그램 폴더를 나타낸다. Windows 2000 이나 그 이상에만 사용할 수 있다.
  65.  
  66. $PRINTHOOD ; 프린터 폴더에 있는 링크 객체를 포함하고 있는 디렉토리를 나타낸다.
  67.  
  68.  


위에 설명된 것 보다 더 많은 상수들이 있지만, 대부분 필요없을것 같아서 더 이상 설명은 하지 않겠다. 더 필요한 내용은 NSIS manual 의 4.2.3 을 보면 되겠다.

변수에 대한 설명을 많이 보았으니 이제 예제를 하나 만들어서 실제로 확인해 보도록 하자.

variables.nsi
  1.  
  2. # set the name of the installer
  3. outfile "variables.exe"
  4.  
  5. # create a default section.
  6. section
  7.  
  8. MessageBox MB_YESNO "$$CMDLINE : $CMDLINE $\n \
  9.                     $$PROGRAMFILES : $PROGRAMFILES $\n \
  10.                     $$SMSTARTUP : $SMSTARTUP $\r \
  11.                     $$WINDIR : $WINDIR "
  12. sectionEnd
  13.  


위 코드를 실행해 보자

코드와의 연관성을 보면 어떤식으로 사용할 수 있을지 확인할 수 있을 것이다. 다른 상수들로 실제로 어떤 의미를 가지는지 확인해 보자.