logo

한국어

function이라는 것은 비어 있거나 또는 그 이상의 명령문을 가진다는 점에서 Section과 비슷하다. 사용자가 만든 function은 인스톨러에 의해서 직접적으로 불리지 않으며, section에서 call 명령을 이용해서 부른다. callback function은 특정한 이벤트가 발생했을때 인스톨러에 의해서 불려진다.

function은 다른 function이나 section의 바깥 부분에서 정의 되어야 한다.

1. Function Commands
 1.1 Function
 

  1. function function_name

 새로운 function을 시작할때 사용하는 명령어이다. 만약 function의 이름이 "."으로 시작하는 function 일반적으로 callback function을 표시한다. 또 "un."으로 시작하면 언인스톨러에서 사용하는 function이다. 일반적으로 인스톨러에서 언인스톨러를 위한 section과 function을 사용하지 못하고, 반대도 마찬가지이다.

  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4. function func
  5.   MessageBox MB_OK "Testing function"
  6. functionend
  7. # create a default section.
  8. section
  9.   call func
  10. sectionEnd


위 코드의 실행이 어떻게 될건지는 잘 알것 같아서 실행된 결과 화면을 첨부하지는 않겠다.

 1.2 FunctionEnd
  function의 끝을 표시하는 명령어 이다.

2 Callback functions
  Callback function은 특별한 이벤트가 발생했을때 인스톨러에 의해서 불려지는 function이다. 현재 사용가능한 callback function은 다음과 같다.
  2.1 인스톨러에의해 불리는 Callback function
   2.1.1 .onGUIInit
   인스톨러에 의해서 첫번째 페이지가 보이기전에 불리는 callback이다. 여기서 유저 인터페이스 부분을 수정할 수 있다.
  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4. Function .onGUIInit
  5. System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, 0, 0, 0, 0, 0x201)"
  6. FunctionEnd
  7.  
  8. # create a default section.
  9. section
  10.  
  11. sectionEnd

위 코드는 NSIS 홈페이지 에서 가져온 것이다. 나도 아직 System:Call은 제대로 공부하지 않아서 어떻게 저렇게 되는지는 잘 모르겠지만, 위 코드를 실행시키면 인스톨러의 위치를 수정할 수 있다. 일반적으로 인스톨러의 위치는 화면의 정 중앙에 나타나지만 위 코드를 실행하면 좌측 최 상단에 위치하게 된다. 다음에 좀 더 공부해서 System:Call에 대해서 분석할때 다시 한번 보면 좋을것 같다.

   2.1.2 .onInit
   인스톨러가 초기화를 거의 끝내고 나서 부르는 callback이다.
  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4. Function .onGUIInit
  5. System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, 0, 0, 0, 0, 0x201)"
  6. FunctionEnd
  7.  
  8.  Function .onInit
  9.    MessageBox MB_YESNO "This will install. Continue?" IDYES NoAbort
  10.      Abort ; causes installer to quit.
  11.    NoAbort:
  12.  FunctionEnd
  13.  
  14.  
  15. # create a default section.
  16. section
  17.  
  18. sectionEnd

위 코드를 실행했을때 .onInit에 있는 메시지 박스 보여 주는 명령어가 먼저 나옴을 알 수있다. 즉 .onGUIInit보다 .onInit가 먼저 실행됨을 알 수 있다. 문법 자체는 간단하므로 뭐 특별히 설명할 부분이 없다.

   2.1.3 .onInstFailed
   인스톨러가 제대로 인스톨을 못했을때(화일을 추출해내지 못했을때라던지, Abort 명령어를 사용하거나 했을때 실행되는 callback이다.

  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4.   Function .onInstFailed
  5.     MessageBox MB_OK "Better luck next time."
  6.   FunctionEnd
  7.  
  8. # create a default section.
  9. section
  10.   abort ; 시작하자 마자 취소함.
  11. sectionEnd

위 코드는 실행시키면 바로 Cancel 버튼이 활성화 된다. Section에서 abort 명령을 사용했기 때문이다. Cancel 버튼을 클릭하면 "Better luck next time"이라는 메시지 박스가 나타날 것이다.

   2.1.4 .onInstSuccess
   인스톨이 성공적으로 이루어 졌을때 인스톨 윈도우가 닫히기 바로 전에 실행된다. 보통은 인스톨이 끝나면 자동으로 인스톨 윈도우가 닫히지 않는다. 이럴 경우에는 사용자가 'Close' 버튼을 누른 다음에 실행된다. 이는 AutoCloseWindow가 디폴트로 false로 되어 있기 때문이다. 이를 true로 바꾸면 'Close' 버튼을 누르지 않아도 자동으로 인스톨 윈도우가 닫히므로 닫히기 직전에 이 callback이 실행된다.

  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4.   Function .onInstSuccess
  5.     MessageBox MB_YESNO "축하합니다. reame 파일을 읽으시겠습니까?" IDNO NoReadme
  6.       Exec notepad.exe ; 노트패드를 실행시켜서 reame 파일을 읽을 수 있게 한다.
  7.     NoReadme:
  8.   FunctionEnd
  9.  
  10. AutoCloseWindow true ; 인스톨 끝난후 자동으로 윈도우 종료
  11. # create a default section.
  12. section
  13.    
  14. sectionEnd

자동으로 인스톨 윈도우가 종료되면서 readme 파일을 읽을 건지 물어 보고, '예'를 누른 경우 노트패드를 실행시킨다.

   2.1.5 .onGUIEnd
   인스톨 윈도우가 닫히고 나서 실행된다. 필요한 경우 플러그인과 관련된 유저 인터페이스에서 사용할 수 있다.
  1. # set the name of the installer
  2. outfile "function.exe"
  3.  
  4.   Function .onInstSuccess
  5.     MessageBox MB_YESNO "축하합니다. reame 파일을 읽으시겠습니까?" IDNO NoReadme
  6.       Exec notepad.exe ; 노트패드를 실행시켜서 reame 파일을 읽을 수 있게 한다.
  7.     NoReadme:
  8.   FunctionEnd
  9.   Function .onGUIEnd
  10.     MessageBox MB_YESNO "테스팅"
  11.   FunctionEnd
  12. AutoCloseWindow true
  13. # create a default section.
  14. section
  15.    
  16. sectionEnd

실행 결과를 보면 .onInstSuccess 보다 .onGUIEnd가 나중에 실행됨을 알 수 있다. 이는 인스톨 윈도우가 닫히고 나서 실행되기 때문이다.

   2.1.6 .onMouseOverSection
   여러개의 component를 인스톨하는 인스톨 화면에서 마우스를 그 component위에 가져 갔을때 description을 보여 줄 수 있는 함수이다. 메뉴얼에 있는 예제 코드는 실제로 Monder User Interface(MUI)를 사용할 때 사용가능하므로 MUI를 설명하는 편에서 설명하겠다.

   2.1.7 .onRebootFailed
   인스톨시에 컴퓨터를 리부팅할 필요가 있을때 Reboot 라는 명령어를 쓰는데, Reboot 명령어가 실패했을때 불리는 callback 이다.

   2.1.8 .onSelChange
   Component 페이지에서 선택에 변경이 생겼을때 불리는 callback 이다. SectionSetFlags와 SectionGetFlags등과 함께 쓰면 유용하게 쓸수 있다. 예제 코드는 다음에 보도록 하겠다

   2.1.9 .onUserAbot
   인스톨러가 인스톨 하는 도중 사용자가 'Cancel' 버튼을 클릭했을때 불리는 callback이다. 만약 이 callback에서 Abort 명령을 사용하며, 인스톨은 계속 진행된다.

   2.1.10 .onVerifyInstDir
   인스톨 경로가 제대로 되었는지 체크를 가능하도록 해주는 callback이다. 이 callback은 사용자가 인스톨 경로를 변경할때 마다 불리므로  주의해야 한다. Abort 명령을 사용하게 되면 $INSTDIR은 이상한 값을 가지게 된다.

대부분의 callback에서는 예제를 들지 않았지만, 나중에 이 모든 것들을 포함해서 만드는 인스톨러 코드를 보여 주도록 하겠다.