'프로그래밍/NSIS'에 해당되는 글 18건

  1. 2007/05/02 게으른 엔지니어 ExperienceUI 에 대한 간단한 소개 (10)
  2. 2007/04/24 게으른 엔지니어 WelcomeFinish.nsi를 분석해 보자
  3. 2007/03/18 게으른 엔지니어 Modern UI를 활용하는 basic.nsi를 해석해보자
  4. 2007/03/16 게으른 엔지니어 Moder User Interface - NSIS (1)
  5. 2007/02/11 게으른 엔지니어 SendMessage - NSIS
  6. 2007/02/08 게으른 엔지니어 FindWindow를 사용해 보자 - NSIS
  7. 2007/02/01 게으른 엔지니어 Example2를 약간 확장해 보자 (3)
  8. 2007/02/01 게으른 엔지니어 NSIS 예제 코드 설명 - example2.nsi (5)
  9. 2007/02/01 게으른 엔지니어 언인스톨러용 callback functions - NSIS 메뉴얼
  10. 2007/01/28 게으른 엔지니어 인스톨러용 Functions/Callback functions- NSIS

ExperienceUI 에 대한 간단한 소개

프로그래밍/NSIS 2007/05/02 15:16 게으른 엔지니어
NSIS에 대한 글을 정리하다가 보니, MUI를 대체할 수 있는 것 중에 하나가 ExperienceUI이다. 나도 아직 인스톨하지는 않아서 직접적으로 캡쳐한 화면을 올리지는 못하지만, NSIS 위키 내용중에 스크립 캡쳐가 있어서 여기에 표시한다. 그리고 http://xpui.sourceforge.net/experienceui/home가 홈페이지이다. 스크린 캡쳐한 것만 보면 요즘 InstallShield와 같은 UI를 보여 주는 것으로 보인다. MUI에 대한 내용을 정리하고 나면 이 UI도 한번 분석해 볼 필요가 있을듯 하다.

이와 비슷한 UI로 InstallSpiderUI 라는 것이 있다. 홈페이지 내용을 보면 Windows 98 인스톨 화면과 비슷하다고 한다. InstallShield 5 와 비슷한 UI라고 적혀 있다.

위 두 UI는 나중에 MUI 이후에 정리해 봐야 겠다. 여기에는 이런 내용이 있다는 것을 레퍼런스로 적어 놓는다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글 10개가 달렸습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/160

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/160

WelcomeFinish.nsi를 분석해 보자

프로그래밍/NSIS 2007/04/24 08:53 게으른 엔지니어
Modern UI 메뉴얼에 있는 예제 중에 하나인 WelcomeFinish.nsi를 한번 분석해 보자. 대부분의 내용은 앞에 basic.nsi에서 설명한 내용이라서 크게 설명할 내용이 없다. 단지 페이지중에 환영을 표시하는 윈도우와 마지막에 끝냄을 알리는 윈도우가 더 포함되어 있는게 다를 뿐이다. 똑같이 언인스톨시에도 환영 윈도우와 언인스톨을 끝냈다는 윈도우가 표시되는 것이다. 다른 부분은 특별히 설명할 내용이 없다.

[code];NSIS Modern User Interface
;Welcome/Finish Page Example Script
;Written by Joost Verburg

;--------------------------------
;Include Modern UI

  !include "MUI.nsh"

;--------------------------------
;General

  ;Name and file
  Name "Modern UI Test"
  OutFile "WelcomeFinish.exe"

  ;Default installation folder
  InstallDir "$PROGRAMFILES\Modern UI Test"

  ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\Modern UI Test" ""

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

;--------------------------------
;Pages

  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_WELCOME
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

Section "Dummy Section" SecDummy

  SetOutPath "$INSTDIR"

  ;ADD YOUR OWN FILES HERE...

  ;Store installation folder
  WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR

  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

;--------------------------------
;Descriptions

  ;Language strings
  LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."

  ;Assign language strings to sections
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
  !insertmacro MUI_FUNCTION_DESCRIPTION_END

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

Section "Uninstall"

  ;ADD YOUR OWN FILES HERE...

  Delete "$INSTDIR\Uninstall.exe"

  RMDir "$INSTDIR"

  DeleteRegKey /ifempty HKCU "Software\Modern UI Test"

SectionEnd
[/code]

사용자 삽입 이미지

31번째줄에 있는 환영 윈도우를 포함한 결과이다.

사용자 삽입 이미지

36번째 줄에 있는 완료 윈도우 화면이다.

사용자 삽입 이미지

38번째 줄에 있는 언인스톨시에 환영 윈도우이다.


사용자 삽입 이미지

41번째 줄에 있는 언인스톨시에 완료를 표시하는 윈도우 이다.


화면 캡쳐를 보면 한글로 나오는 것을 알 수 있다. 원래 예제 파일 자체를 컴파일해서 실행해 보면 영어로 되어 있다. 46번째줄을 보면 영어로 되어 있는 것을 확인할 수 있다. 그러면 한글로 보고 싶을 경우는 어떻게 하면 될까? 화면과 같이 한글로 나오게 할려면 46번째 줄만 수정하면 되지만, 69번째 줄을 보면 영어로 컴포넌트에 대한 설명을 적는 것을 볼 수 있다. 아래 화면을 보면 Dummy Section에 대한 상세 설명까지 한글로 되어 있다. 이렇게 한글을 보게 할려면 어떤 부분을 수정하면 될지 해보기 바란다.

사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/159

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/159

Modern UI 메뉴얼에 있는 basic.nsi에 있는 내용들에 대해서 자세하게 이해해 보도록 하자.

[code type=nsis];NSIS Modern User Interface
;Basic Example Script
;Written by Joost Verburg

;--------------------------------
;Include Modern UI

  !include "MUI.nsh"

;--------------------------------
;General

  ;Name and file
  Name "Modern UI Test"
  OutFile "Basic.exe"

  ;Default installation folder
  InstallDir "$PROGRAMFILES\Modern UI Test"
 
  ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\Modern UI Test" ""

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

;--------------------------------
;Pages

  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
 
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
 
;--------------------------------
;Languages
 
  !insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

Section "Dummy Section" SecDummy

  SetOutPath "$INSTDIR"
 
  ;ADD YOUR OWN FILES HERE...
 
  ;Store installation folder
  WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
 
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

;--------------------------------
;Descriptions

  ;Language strings
  LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."

  ;Assign language strings to sections
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
  !insertmacro MUI_FUNCTION_DESCRIPTION_END

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

Section "Uninstall"

  ;ADD YOUR OWN FILES HERE...

  Delete "$INSTDIR\Uninstall.exe"

  RMDir "$INSTDIR"

  DeleteRegKey /ifempty HKCU "Software\Modern UI Test"

SectionEnd[/code]

18 : 인스톨 디렉토리를 $INSTDIR에 저장하는 명령어이다.

21 : 지정된 레지스트리에 값이 있으면 그 값을 사용해서 18번째줄에서 $INSTDIR에 지정한 값을 덮어 쓰게 된다. 아무런 값이 없으면 $INSTDIR은 18번째줄에서 지정한 값을 그대로 가지게 된다. HKCU는 레지스트리중에서 HKEY_CURRENT_USER를 뜻한다.

26 : MUI_ABORTWARNING 매크로는 사용자가 인스톨러를 닫을려고 할때 경고 메시지를 보여 주는 창을 보여 주라는 매크로이다.

31~37 : 인스톨시 보여주는 페이지 4개와 언인스톨시 보여주는 페이지 2개를 삽입하는 내용이다. 인스톨시 보여주는 화면은 라이센스 화면, 컴포넌트 화면, 인스톨 디렉토리 화면, 파일 인스톨 하는 화면등이다. 언인스톨시에는 언인스톨 확인 화면, 파일을 실제로 언인스톨하는 화면등으로 구성됨을 할 수 있다.

42 : 인스톨시에 사용되는 언어가 "English"임을 표시하는 매크로이다.

47 ~ 59 : 실제로 인스톨시에 할 작업들을 구성하는 섹션이다. 54번째줄은 인스톨한 디렉토리를 레지스트리에 쓰는 과정이다. 57번째줄은 언인스톨러를 만드는 과정이다.

65 : LangString은 인스톨러를 다양한 언어용으로 만들 경우에 유용한 명령어 이다. 그 사용법은 NSIS 메뉴얼에 있는 아래 예제를 가지고 생각해 보자.

 LangString message ${LANG_ENGLISH} "English message"
 LangString message ${LANG_FRENCH} "French message"
 LangString message ${LANG_KOREAN} "Korean message"

 MessageBox MB_OK "A translated message: $(message)"
위와 같이 하나의 변수에 다양한 언어용으로 값을 저장할 수 있다. 그래서 실제로 사용할때는 그 변수 하나만 사용함으로써 편하게 사용할 수 있다. 이는 원래 코드에 있는 42번째줄에서 셋탕한 언어용 값이 나오게 된다. 여기서는 "English" 하나의 언어만 사용하므로 65번째줄에서 그 값을 ${LANG_ENGLISH}라는 id로 DESC_SecDummy 변수에 저장했다. 이는 69번째줄에서 보는 것처럼 사용하면 된다.그러면 언어 셋팅에 따라서 맞는 id의 값을 사용하게 된다.

68 ~ 70 : 인스톨시 컴포넌트 페이지에서 컴포넌트위에 마우스를 가져 갔을때 그 설명을 보여 주는 것을 보여 주는 부분이다. 여기서는 컴포넌트가 하나뿐이라서 MUI_DESCRIPTION_TEXT가 하나 뿐이지만, 만약 여러개의 컴포넌트이면 그 만큼 MUI_DESCRIPTION_TEXT를 추가 하면 된다.

75 ~ 85 : 언인스톨러에 대한 내용이다. 79번째줄에서 언인스톨러를 삭제하고, 81번째줄에서 인스톨했던 디렉토리를 지우며, 83번째줄에서 레지스트리를 지우라는 명령어이다. DeleteRegKey에서 /ifempty 옵션이 사용됐으므로 레지스트리 키가 다른 하위키를 가지고 있지 않을 경우에만 레지스트리를 삭제하라는 명령이다.



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/155

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/155

Moder User Interface - NSIS

프로그래밍/NSIS 2007/03/16 14:54 게으른 엔지니어
정말 오랜만에 NSIS에 관한 글을 포스팅한다. 가끔 블로그에 누가, 어떤 이유로 오는지 궁금해서 리퍼러 기록을 보면 대부분 NSIS에 관한 글 때문에 오는 걸로 보이는데, 요 근래에는 넘 바빠서(실제로는 마음에 여유가 없었다) NSIS에 관한 글을 포스팅하지 못했다. 예전부터 가지고 있던 네이버 블로그의 내용을 옮겨 오는 작업이 전부 였다. 여기서 NSIS에 대한 글을 자주 포스팅 한다고 적지는 못하겠다. 그냥 내가 시간이되면 내 마음 내키는 데로 글을 올릴 것이다...



아래 내용은 기본적으로 NSIS 2.24 안에 있는 메뉴얼에서 발췌한 내용이다.

NSIS 2 부터 사용자 정의 인터페이스가 가능하게 되었는데, Modern UI는 윈도우즈의 마법사 형태와 비슷한 인터페이스를 제공해 준다.

새로운 인터페이스는 몇개의 새로운 화면을 제공하고, 컴포넌트 페이지에서 설명을 포함시킬 수 있다. Modern UI 매크로를 이용해서 인스톨러를 만드면 손쉽게 인터페이스를 만들 수 있다.

Modern UI 셋팅은 기존의 NSIS 셋팅과 다르기 때문에, LicenseText, Icon, CheckBitmap, InstallColors등과 같은 셋팅을 할 수 없다.

Modern UI는 인터페이스를 조절할 매크로를 제공하기 때문에 손쉽게 사용할 수 있다. Modern UI를 사용하고자 할 때는 아래의 설명과 같이 하면 된다.

Syntax
 앞에서 얘기했듯이 매크로로 이미 다 정의되어 있기 때문에 매크로에 값을 대입하거나 혹은 참/거짓 으로 셋팅할 수 있다.

파라메타 셋팅은 다음과 같은 형식으로 셋팅한다

required (option1 | option2) [optional]


정의된 셋팅에 대한 파라메타는 한 개의 문자열로 되어 있어야 한다. 즉 " "로 감싸져야 한다는 뜻이다. 만약에 문자열안에 " 를 포함시켜야 할 경우는 $\" 형태로 사용해야 한다.

몇 개 예제를 보자

[code]!define MUI_COMPONENTPAGE_SMALLDESC ; No value
!define MUI_UI "myUI.exe" ; Value
!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ; Multiple settings[/code]

첫 번째 줄은 값을 지정하지 않고 셋팅을 하겠다는 내용이다. 두 번째줄은  myUI.exe라는 셋팅 값을 한개 보낼때 이고, 세 번째줄은 두 개의 셋팅 값을 주는 것이다. 실제로 어떤 매크로 인지는 나중에 보도록 하겠다.

1. Header file

[code]!include "MUI.nsh"[/code]
MUI.nsh는 NSIS를 인스톨 했을때 생성되는 Include 디렉토리안에 있으므로 include할때 특별히 경로를 지정할 필요는 없다. 이 파일은 무조건 include해야 하는 것이다. 만약 include하지 않으면 MUI 에서 사용하는 매크로를 사용할 수 없다.

2. Interface Configuration

Interface 셋팅의 경우 고전적인1 인터페이스와 교체 가능한 매크로를 제공하고 있다. 여기에 설명하고 있는 Interface Configuration에 쓰이는 모든 셋팅은 이 다음에 나오는 Pages interface 보다 무조건 먼저 나와야 한다.

2.1. Interface Settings
전체적인 Interface에 대한 셋팅을 어떻게 할 건지에 대한 많은 매크로가 있다. 여기서 그 각각을 전부 설명하는 건 무리가 있으므로 나중에 예제 설명시에 필요한 매크로만 설명하도록 하겠다. 대부분의 매크로가 각각의 페이지에 이미지를 어떻것을 넣을건지를 셋팅할 수 있게 되어 있다.

3. Pages

사용하고자 하는 페이지가 있으면 지정된 매크로를 이용해서 어떤 페이지를 사용할 건지 NSIS에게 알려 줘야 한다. 그리고 사용자가 만든 페이지가 있으면 그 역시 매크로로 지정하여 인스톨시에 페이지로 표시할 수 있다.

예를 들어 보면,

[code]!insertmacro MUI_PAGE_LICENSE "License.rtf"
!insertmacro MUI_PAGE_COMPONENTS

Var STARTMENU_FOLDER
!insertmacro MUI_PAGE_STARTMENU "Application" $STARTMENU_FOLDER[/code]
1번째줄은 License.rtf 파일을 읽어서 라이센스 페이지를 출력하라는 얘기이다. 2번째줄은 컴포넌트를 보여 주는 페이지를 출력하는 것이고, 3번째줄은 Start Menu Folder 페이지에 대한 page id 를 받아서 STARTMENU_FOLDER 변수에 대입하는 것이다.

위의 예제에서 보는 것 처럼 필요한 매크로를 활용하는 것으로 MUI를 쓰기 위한 작업은 대부분 끝이 난다. 때문에 얼마나 많은 매크로를 자유 자재로 사용하는지가 MUI를 잘 쓰는지 달려있다.

Installer Pages
MUI_PAGE_WELCOME
MUI_PAGE_LICENSE text/rtf_file
MUI_PAGE_COMPONENTS
MUI_PAGE_DIRECTORY
MUI_PAGE_STARTMENU page_id variable
MUI_PAGE_INSTFILES
MUI_PAGE_FINISH

Uninstaller Pages
MUI_UNPAGE_WELCOME
MUI_UNPAGE_CONFIRM
MUI_UNPAGE_LICENSE text/rtf_file
MUI_UNPAGE_COMPONENTS
MUI_UNPAGE_DIRECTORY
MUI_UNPAGE_INSTFILES
MUI_UNPAGE_FINISH

각각의 페이지에 대한 기본적인 매크로는 위와 같다. 직관적으로 어떤 식으로 사용되는지 알 수 있으므로 따로 설명하지는 않겠다. 위에 있는 페이지에 대한 모양을 꾸미는 것은 Interface settings에 있는 매크로를 이용해서 표시되는 이미지를 바꿀 수 있으며, 텍스트에 관련된 부분을 바꾸는 것은 Page Settings에 있는 매크로를 이용해서 바꾸게 된다. Page Settings에 있는 매크로를 사용할 경우 실제 페이지를 삽입하는 매크로, 즉 위에 나와 있는 매크로, 보다는 먼저 설정을 해야 한다.

간단하게 Welcome Page Settings에 있는 매크로를 보면

MUI_WELCOMEPAGE_TITLE title
Title to display on the top of the page.

MUI_WELCOMEPAGE_TITLE_3LINES
Extra space for the title area.

MUI_WELCOMEPAGE_TEXT text
Text to display on the page. Use \r\n for a newline.

위 매크로를 보면 Welcome page의 텍스트를 바꾸는 것을 알 수 있다.


4. Custom functions

사용자가 직접 작성한 함수들을 포함시킬 수도 있다. 이 부분도 나중에 다시 설명하도록 하겠다.

5. Language files

인스톨러에 어떤 언어로 보여 줄건지를 결정할 수 있는 셋팅을 할 수 있게 해주는 매크로이다.

[code]!insertmacro MUI_LANGUAGE "English"[/code]

위와 같이 쓰면 언어에 맞는 NLF 파일을 로드해서 인스톨시에 보여 주게 된다.

만약 사용자가 볼려고 하는 언어를 결정하기 위해서는 아래와 같이 .onInit 함수에 MUI_LANGDLL_DISPLAY 매크로를 쓰면 된다.

[code]Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd[/code]

5.1. Language Selection Dialog Settings

인스톨시에 사용자가 결정한 언어를 레지스트리에 저장하기 위해서 아래와 같은 매크로를 써서 저장했다가 언인스톨시에 MUI_UNGETLANGUAGE 매크로로 자동으로 언어를 결정하도록 할 수 있다.

MUI_LANGDLL_REGISTRY_ROOT root
MUI_LANGDLL_REGISTRY_KEY key
MUI_LANGDLL_REGISTRY_VALUENAME value_name
위의 레지스트리는 언인스톨시에 직접 삭제하도록 해야 삭제가 된다. 자동으로 삭제가 안되므로 빼먹지 말도록 하자. 언인스톨시에는 아래와 같이 사용한다.

[code]Function un.onInit
  !insertmacro MUI_UNGETLANGUAGE
FunctionEnd[/code]

또한 언어 선택 윈도우의 타이틀등을 수정할 수 있는 매크로도 제공된다.

6. Reserve Files

NSIS는 기본적으로 인스톨러를 만들면 압축을 해서 하나의 파일로 제공하게 된다. 이때 내부적으로 몇가지 압축 알고리즘을 이용해서 압축을 하게 된다. 컴파일러 플래크 중에 /SOLID 라는 플래그를 사용하면 모든 데이타에 대해서도 압축을 하게 된다. 이렇게 하면 파일의 크기는 작아 지지만, 실제 인스톨시에는 이 부분에 대해서도 압축을 푸는 시간이 걸리게 된다. Reserve Files 분류에 있는 매크로는 /SOLID 플래그를 사용했을때 특정한 데이타는 압축을 하지 않도록 공간을 마련하는 매크로들이다. 생각하기에 특별히 사용할 일이 없을듯 한 매크로이다. 지금은 디폴트로 /SOLID 플래그가 셋팅이 되지 않기 때문에 사용자가 직접적으로 /SOLID 플래그를 줘야 효과가 나타나는 매크로들이기 때문이다.

7. Your own sections and functions

사용자 섹션이나 함수들을 포함할 수도 있는데, 이는 여기서 다루기에는 좀 힘들다... 나두 아직 잘모른다는... ㅋㅋㅋ

8. Section Description

고전적인 NSIS의 인터페이스에도 컴포넌트를 선택하는 페이지를 만들 수 있지만, 문제점이 어떤 컴포넌트 위에 마우스를 가져 갔을때 으떤 컴포넌트인지 설명이 안 나오는게 되어 있다. Modern UI 에서는 이 부분을 가능하게 하는 매크로들이 있다. 컴포넌트에서 설명을 보여 주지 않을려면 MUI_COMPONENTSPAGE_NODESC 매크로를 셋팅하면 된다.

컴포넌트에 설명을 적을려면 다음과 같이 하면 된다.

[code]Section "Section Name 1" Section1
   ...
SectionEnd

;Use these macros to set the descriptions:

LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
!insertmacro MUI_FUNCTION_DESCRIPTION_END[/code]

언인스톨시에도 컴포넌트에 설명을 할 필요가 있는 경우 MUI_UNFUNCTION_DESCRIPTION_BEGIN과 MUI_UNFUNCTION_DESCRIPTION_END 매크로를 위와 같이 사용하면 되겠다.

이제 Modern UI를 사용하는데 필요한 기본적인 내용은 다 배웠다. 다음에는 실제 예제를 훑어 보면서 의미를 생각해 보자.


크리에이티브 커먼즈 라이센스
Creative Commons License
  1. 기존에 NSIS의 인터페이스 [Back]
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글 하나가 달렸습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/154

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/154

SendMessage - NSIS

프로그래밍/NSIS 2007/02/11 15:02 게으른 엔지니어

FindWindow와 함께 자주 많이 쓰이는 함수가 SendMessage이다. 윈도우 응용 프로그램을 만들어 본 사람은 자주 사용하는 기능이다. FindWindow로 찾은 핸들에 사용자가 뭔가 작업을 하기 위해서 메시지를 보내는 함수이다. 메뉴얼에 적혀 있는 설명을 보도록 하자.

4.9.14.10 SendMessage

HWND msg wparam lparam [user_var(return value)] [/TIMEOUT=time_in_ms]

Sends a message to HWND. If a user variable $x is specified as the last parameter (or one before the last if you use /TIMEOUT), the return value of SendMessage will be stored to it. Note that when specifying 'msg' you must just use the integer value of the message. If you wish to send strings use "STR:a string" as wParam or lParam where needed.

  • WM_CLOSE 16
  • WM_COMMAND 273
  • WM_USER 1024

Include WinMessages.nsh to have all of Windows messages defined in your script.

To send a string param, put STR: before the parameter, for example: "STR:Some string".

Use /TIMEOUT=time_in_ms to specify the duration, in milliseconds, of the time-out period.

!include WinMessages.nsh
FindWindow $0 "Winamp v1.x"
SendMessage $0 ${WM_CLOSE} 0 0

위의 설명을 보면 SendMessage를 사용하기 위해서는 항상 컴포넌트의 핸들이 필요하다. 이 핸들을 구하기 위해서 필요한 함수가 FindWindow 이다. 그리고 메시지에 대한 정수 값을 알아야 하는데, 이를 윈도우와 같이 정의한 파일인 WinMessages.nsh를 포함시키면 "WM_CLOSE"와 같이 사용할 수 있다. 설명보다는 아래 코드1를 실행해 보면 어떤 일을 하는지 알 수 있을 것이다.
[code];Classic UI
 
!include "WinMessages.nsh"
 
Name "dummy"
OutFile "dummy.exe"
XPStyle on
ShowInstDetails show
InstallDir $EXEDIR
 
Page directory "" "DirShowProc" ""
Page instfiles
 
Function "DirShowProc"
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1019
CreateFont $1 "Arial" 8 0
SendMessage $0 ${WM_SETFONT} $1 0
SetCtlColors $0 0x00BAB0A6 0x000000
FunctionEnd
 
Section
; void
SectionEnd[/code]

아래 결과 화면을 보면 Destination Folder 부분에 적혀 있는 글을 보면 평소보다 글씨 크기가 큰 것을 알 수 있다. 이는 17번째줄에서 SendMessage를 이용하여 크기를 15로 바꾸도록 메시지를 보냈기 때문이다. 이와 같이 NSIS에서 미리 정의된 화면을 바꿀때도 사용할 수 있지만, 아이디어만 있으면 다양하게 사용할 수 있는 명령어이다.


사용자 삽입 이미지




[code]!include "WinMessages.nsh"

OutFile "UsingNotepad.exe"
Name "Print text to editor"
;Caption "CD input Plug-in Changer Built by Borg_No.One"
;SilentInstall "silent"
ShowInstDetails "hide"
;DirShow "hide"
;InstallDir $PROGRAMFILESWinamp

Function .onInit

FunctionEnd

Section DoItAll
Call CloseWinamp
SectionEnd

Function CloseWinamp
Exec $WINDIR\Notepad.exe

findloop:
Sleep 500
FindWindow $0 "Notepad"
StrCmp $0 0 findloop

FindWindow $1 "Edit" "" $0

SendMessage $1 ${WM_CHAR} 0x68 0x230001

MessageBox MB_OK "Click OK to close Notepad"

SendMessage $0 ${WM_CLOSE} 0 0
Pop $0
FunctionEnd[/code]

 위 코드2를 한번 실행해 보자. 재미난  현상을 볼 수 있을 것이다. Notepad가 실행되고 거기에 h라는 글이 쓰여  질것이다. 인스톨러에서 직접 실행해 보기 바란다. 분석하기 위해서 알아야  할 내용은 이때까지 충분히 알려 줬다고 생각한다.

크리에이티브 커먼즈 라이센스
Creative Commons License
  1. NSIS 홈페이지에서 가져 온 내용이다. [Back]
  2. 홈페이지에서 Borg Number One님이 올리신 내용을 발췌한  내용이다. 약간의 수정을 했다. notepad 실행이 안되서 실행되도록 추가 하고  필요없는 부분은 주석 처리했다. [Back]
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/132

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/132

FindWindow를 사용해 보자 - NSIS

프로그래밍/NSIS 2007/02/08 10:06 게으른 엔지니어
인스톨러를 만들때 좀 자유롭게 인스톨러 화면을 바꾸고자 할때 주로 사용하는 함수가 바로 FindWindow와 SendMessage 이다. FindWindow는 화면상에서 바꿀려고 하는 아이템의 핸들을 받아 올때 사용하고, SendMessage는 아이템에 실제로 바꾸고자 하는 내용을 전달하는 함수 이다. 윈도우용 프로그램을 해보았다면, 아마 사용해본 함수들일 것이다. 윈도우용 함수와 거의 똑같은 용도로 사용하므로 친숙할 것이다. 예제 파일들을 보다 보면 자주 보이는 함수들이므로 여기서 한번 정리하고 가도록 하자

일단 메뉴얼에 어떻게 적혀 있는지 확인부터 해보자

4.9.14.5 FindWindow

user_var(hwnd output) windowclass [windowtitle] [windowparent] [childafter]

Searches for a window. Behaves like the win32 FindWindowEx(). Searches by windowclass (and/or windowtitle if specified). If windowparent or childafter are specified, the search will be restricted as such. If windowclass or windowtitle is specified as "", they will not be used for the search. If the window is not found, the user variable returned is 0. To accomplish old-style FindWindow behavior, use FindWindow with SendMessage.

[code]FindWindow $0 "#32770" "" $HWNDPARENT
FindWindow $0 "my window class" "my window title"[/code]
위의 설명을 보면 내용은 간다하다. 즉 FindWindow 다음에 있는 변수에 윈도우 클래스를 적어 주면 찾아서 그 핸들을 넘겨 준다고 생각하면 된다. 만약에 찾는 윈도우 클래스가 없으면 유저 변수에 0이 저장된다. 실제 작동하는 코드를 가지고 생각해 보자.

[code]# set the name of the installer
outfile "FindWindow"

!include WinMessages.nsh


; Kill all instances of Internet Explorer
Function .onInit
;Finding all IE Windows
loop:
    FindWindow $0 "IEFrame"
    IntCmp $0 0 done
    IsWindow $0 0 done
    MessageBox MB_YESNO $0 IDYES close_window IDNO sleep

close_window:
    System::Call 'user32::PostMessageA(i,i,i,i) i($0,${WM_CLOSE},0,0)'

sleep:
    Sleep 100
    Goto loop
done:
FunctionEnd

# create a default section.
section

sectionEnd[/code]

4 : WinMessages.nsh 를 포함시키는 것은 17번째줄에서 사용하는 WM_CLOSE 메시지 때문이다.
8 ~ 23 : .onInit 함수이므로 실제로 인스톨 화면을 보여 주기 전에 실행되는 callback이다. 앞에 포스팅 된 글을 참고 하기 바란다.
11 : FindWindow로 윈도우 클래스가 IEFrame 인 윈도우를 찾아서 그 핸들을 $0 에 저장하는 것이다. 앞에 포스팅 된 글에서 언급했듯이 $0는 미리 지정된 유저가 사용할 수 있는 변수이다.
12 : IntCmp1 는 첫 번째 인수와 두 번째 인수를 정수값으로 비교하는 명령어 이다. 문자열 비교는 StrCmp를 쓰게 된다. 여기서는 $0가 0이면 done으로 가라는 명령이므로 만약 IE를 찾지 못했을 경우 done으로 가라는 명령이다.
13 : IsWindow2는 첫 번째 인수로 받은 핸들이 윈도우인 경우 바로 다음줄로 가고 아닌 경우 done 레이블로 가라는 뜻이다.
14 : MessageBox에서 "Yes" 버튼을 클릭하면 close_window 레이블로 가고 "No" 버튼을 클릭하면 sleep 레이블로 가게 된다.
17 : 실제로 받은 핸들에 WM_CLOSE 메시지를 보낸다. 즉 위에서 찾은 핸들을 close 하도록 한다. 여기는 할 말이 아주 많으므로 다음에 한번 정리 하도록 하겠다.
20 : 밀리 초 단위로 잠시 연기 하는 명령어 이다. 즉 100 밀리 초 이므로 0.1초 동안 잠시 연기 했다가 그 다음 명령어로 넘어 가게 된다.

위의 코드는 실제로 한번 인스톨한 프로그램을 다시 인스톨할때 만약 인스톨할려는 프로그램이 실행중이면 실행을 닫아야 하므로 상당히 유용한 코드이다. 실제 function 부분은 NSIS 공식 싸이트에서 발췌한 내용이다.

위와 같이 FindWindow를 사용할려고 하면 문제가 되는 부분이 윈도우 클래스를 알아 내는 부분이다. 이 부분을 알아 내기 위한 프로그램이 있는데3 Win32Spy 이다. freeware라서 편의를 위해서 여기에 같이 첨부하겠다.4파일 크기가 아주 작고 인스톨할 필요도 없는 편리한 프로그램 같다. 사실 아직 내가 직접 써보지는 않았다.

적다 보니 내용이 길어 지는 듯해서 여기서 그만 끊고, SendMessage는 다음 포스팅에서 설명하도록 하겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
  1. IntCmp $0 5 is5 lessthan5 morethan5 와 같이 사용할 경우 $0에 저장된 값과 5를 비교하여 같을 경우 is5로 가고, $0가 5보다 작을 경우 lessthan5로 $0가 5보다 큰 경우 morethan5로 가라는 명령이다. [Back]
  2. IsWindow $0 0 +3 와 같은 경우 $0에 저장된 핸들이 윈도우인 경우 바로 다음줄로 가고 윈도우가 아닌 경우 3번째 명령어로 가라는 뜻이다. [Back]
  3. 이 역시 NSIS에 나와 있는 부분이다. [Back]
  4. 파일 첨부 방법을 몰라서 일단은 첨부하지 않고, 알아 내는데로 여기에 첨부하겠다. T.g [Back]
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/131

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/131

Example2를 약간 확장해 보자

프로그래밍/NSIS 2007/02/01 22:58 게으른 엔지니어
 거창한건 아니고 앞에서 설명했던 Example2 예제에서 인스톨시에 보면 어떤 파일이 인스톨되는지 보여주지를 않는다. 아래 그림같이  "Show details"라는 버튼이 있다. 이걸 누르면 어떤 파일이 어디에 인스톨됐는지 자세하게 보여 주게 된다. 이를 대신해서  인스톨시에 그 내용을 자세하게 자동으로 보여 주게 할려면 어떻게 하면 될까?
사용자 삽입 이미지

명령어 중에 'ShowInstDetails'가 있다. 이 명령어에 show 를 주게 되면 인스톨시에 자세하게 어떤 파일이 현재 어디로 인스톨되고 있는지 알려 준다.

[code]ShowInstDetails show[/code]
와 같이 사용하면 된다. 이 명령어를 앞에 Example2 예제에 18번째 줄에 넣어 놓으면 인스톨시에 아래와 같은 화면을 보게 된다.
사용자 삽입 이미지


자 그럼 여기서 또 하나의 Quiz.... ShowInstDetails 는 위와 같이 인스톨시에 자세한 내용을 보여 주지만, 언인스톨시에는 그 내용을 보여 주지 않는다. 언인스톨시에도 아래와 같이 보여 줄려면 어떤 명령을 쓰면 될까?
사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글 3개가 달렸습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/130

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/130

NSIS 예제 코드 설명 - example2.nsi

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

그럼 첫 번째로 분석할 예제는 example2.nsi 라는 파일이다. 코드는 아래와 같다.
[code]; example2.nsi
;
; This script is based on example1.nsi, but it remember the directory,
; has uninstall support and (optionally) installs start menu shortcuts.
;
; It will install example2.nsi into a directory that the user selects,

;--------------------------------

; The name of the installer
Name "Example2"

; The file to write
OutFile "example2.exe"

; The default installation directory
InstallDir $PROGRAMFILES\Example2

; Registry key to check for directory (so if you install again, it will
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir"

;--------------------------------

; Pages

Page components
Page directory
Page instfiles

UninstPage uninstConfirm
UninstPage instfiles

;--------------------------------

; The stuff to install
Section "Example2 (required)"

  SectionIn RO
 
  ; Set output path to the installation directory.
  SetOutPath $INSTDIR
 
  ; Put file there
  File "example2.nsi"
 
  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR"
 
  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1
  WriteUninstaller "uninstall.exe"
 
SectionEnd

; Optional section (can be disabled by the user)
Section "Start Menu Shortcuts"

  CreateDirectory "$SMPROGRAMS\Example2"
  CreateShortCut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi" "" "$INSTDIR\example2.nsi" 0
 
SectionEnd

;--------------------------------

; Uninstaller

Section "Uninstall"
 
  ; Remove registry keys
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"
  DeleteRegKey HKLM SOFTWARE\NSIS_Example2

  ; Remove files and uninstaller
  Delete $INSTDIR\example2.nsi
  Delete $INSTDIR\uninstall.exe

  ; Remove shortcuts, if any
  Delete "$SMPROGRAMS\Example2\*.*"

  ; Remove directories used
  RMDir "$SMPROGRAMS\Example2"
  RMDir "$INSTDIR"

SectionEnd[/code]

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

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 : 디렉토리 자체를 지운다.

언인스톨이 끝난 후에는 아래와 같은 화면이 나오게 된다.
사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG ,
받은 트랙백이 없고, 댓글 5개가 달렸습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/129

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/129

언인스톨러용 callback은 알아 보기 쉽도록 되어 있다. callback이므로  시작은 '.'으로 하지만, 언인스톨러에서 사용되는 callback이라서 앞에 'un'이 전부 붙어 있다. 그 뒤에 이름은 인스톨러용 callback과 같은 것들은 언인스톨러에서 같은 기능을 한다고 여기면 된다.

1. un.onGUIInit

2. un.onInit

3. un.onUninstFailed

4. un.onUninstSuccess

5. un.onGUIEnd

6. un.onRebootFailed

7. un.onUserAbort

인스톨러에서 각각의 callback을 설명했으니 여기서는 생락하겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/128

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/128

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

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

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

[code]# set the name of the installer
outfile "function.exe"

function func
  MessageBox MB_OK "Testing function"
functionend
# create a default section.
section
  call func
sectionEnd[/code]

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

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

2 Callback functions
  Callback function은 특별한 이벤트가 발생했을때 인스톨러에 의해서 불려지는 function이다. 현재 사용가능한 callback function은 다음과 같다.
  2.1 인스톨러에의해 불리는 Callback function
   2.1.1 .onGUIInit
   인스톨러에 의해서 첫번째 페이지가 보이기전에 불리는 callback이다. 여기서 유저 인터페이스 부분을 수정할 수 있다.
[code]# set the name of the installer
outfile "function.exe"

Function .onGUIInit
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, 0, 0, 0, 0, 0x201)"
FunctionEnd

# create a default section.
section

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

   2.1.2 .onInit
   인스톨러가 초기화를 거의 끝내고 나서 부르는 callback이다.
[code]# set the name of the installer
outfile "function.exe"

Function .onGUIInit
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, 0, 0, 0, 0, 0x201)"
FunctionEnd

 Function .onInit
   MessageBox MB_YESNO "This will install. Continue?" IDYES NoAbort
     Abort ; causes installer to quit.
   NoAbort:
 FunctionEnd


# create a default section.
section

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

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

[code]# set the name of the installer
outfile "function.exe"

  Function .onInstFailed
    MessageBox MB_OK "Better luck next time."
  FunctionEnd

# create a default section.
section
  abort ; 시작하자 마자 취소함.
sectionEnd[/code]
위 코드는 실행시키면 바로 Cancel 버튼이 활성화 된다. Section에서 abort 명령을 사용했기 때문이다. Cancel 버튼을 클릭하면 "Better luck next time"이라는 메시지 박스가 나타날 것이다.

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

[code]# set the name of the installer
outfile "function.exe"

  Function .onInstSuccess
    MessageBox MB_YESNO "축하합니다. reame 파일을 읽으시겠습니까?" IDNO NoReadme
      Exec notepad.exe ; 노트패드를 실행시켜서 reame 파일을 읽을 수 있게 한다.
    NoReadme:
  FunctionEnd

AutoCloseWindow true ; 인스톨 끝난후 자동으로 윈도우 종료
# create a default section.
section
  
sectionEnd[/code]
자동으로 인스톨 윈도우가 종료되면서 readme 파일을 읽을 건지 물어 보고, '예'를 누른 경우 노트패드를 실행시킨다.

   2.1.5 .onGUIEnd
   인스톨 윈도우가 닫히고 나서 실행된다. 필요한 경우 플러그인과 관련된 유저 인터페이스에서 사용할 수 있다.
[code]# set the name of the installer
outfile "function.exe"

  Function .onInstSuccess
    MessageBox MB_YESNO "축하합니다. reame 파일을 읽으시겠습니까?" IDNO NoReadme
      Exec notepad.exe ; 노트패드를 실행시켜서 reame 파일을 읽을 수 있게 한다.
    NoReadme:
  FunctionEnd
 
  Function .onGUIEnd
    MessageBox MB_YESNO "테스팅"
  FunctionEnd
AutoCloseWindow true
# create a default section.
section
  
sectionEnd[/code]
실행 결과를 보면 .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에서는 예제를 들지 않았지만, 나중에 이 모든 것들을 포함해서 만드는 인스톨러 코드를 보여 주도록 하겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG ,
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/126

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/126