<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=NSIS</id>
	<title>NSIS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=NSIS"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=NSIS&amp;action=history"/>
	<updated>2026-05-14T18:42:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=NSIS&amp;diff=34779&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=NSIS&amp;diff=34779&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
== NSIS ==&lt;br /&gt;
=== Opening Statement ===&lt;br /&gt;
보통 프로그램을 개발하고 나서 &amp;#039;만들었다&amp;#039; 로 끝나는 경우가 많다. 하지만, 정작 배포때에는 할일이 많다. 특히 제어판 프로그램 등록/삭제 에 등록되는 방식이라던지, 레지스트리를 건드린다던지, Program Files 폴더에 복사한다던지. 이 경우에는 보통 전용 Installer 프로그램을 쓰게 되지만, 아직 제대로 써본 적이 없었던 것 같다.&lt;br /&gt;
&lt;br /&gt;
이번에는 &amp;#039;배포&amp;#039; 라는 녀석에 대해 촛점을 맞춰보고자, 인스톨러중 하나인 NSIS 에 대해 간단히 정리하고자 한다. (자.. 이제 폼좀 내면서 만든 프로그램 보여주자. ^^; 이게 가장 큰 목적. --;)&lt;br /&gt;
&lt;br /&gt;
nsis 는 free software 이며, 소스가 공개되어있다. 관심있는 사람들은 분석해보시길.&lt;br /&gt;
&lt;br /&gt;
=== 참조 링크 ===&lt;br /&gt;
* http://www.nullsoft.com/free/nsis/ - null software 의 nsis 관련 홈페이지.&lt;br /&gt;
* http://forums.winamp.com/forumdisplay.php?forumid=65 - nsis discussion&lt;br /&gt;
* http://www.nullsoft.com/free/nsis/makensitemplate.phtml - .nsi code generator&lt;br /&gt;
&lt;br /&gt;
=== 전체 과정 ===&lt;br /&gt;
NSIS의 원리는 간단하다. nsi 라는 스크립트 화일을 해석해서 해당 맞는 프로그램들을 하나의 화일로 압축시키고 실행프로그램으로 만드는 것이다. (마치 배치화일을 작성한다고 생각할수도 있겠다.)&lt;br /&gt;
&lt;br /&gt;
# 프로그램을 개발한다.&lt;br /&gt;
* NSI Script 를 작성한다.&lt;br /&gt;
* makensis 로 Script 를 컴파일한다. 그러면 makensis 는 스크립트를 분석하면서 포함해야 할 화일들을 하나로 묶어준다. 그리고 zip의 형식으로 압축해준다. (내부적으로 zip2exe 가 이용된다. 이건 zlib 사용됨.)&lt;br /&gt;
* 하나의 Install 화일 생성. 완료. (뿌리자~ -_-v)&lt;br /&gt;
=== MakeNSIS usage ===&lt;br /&gt;
NSIS installer들은 &amp;#039;MakeNSIS&amp;#039; 프로그램에 의해서 NSI script (.NSI) 를 컴파일함으로서 만들어진다.&lt;br /&gt;
makensis 의 실행 문법은 대강 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
 Makensis [/Vx] [/Olog] [/LICENSE] [/PAUSE] [/NOCONFIG] [/CMDHELP [command]] [/HDRINFO] [/CD] [/Ddefine[=value] ...]&lt;br /&gt;
          [&amp;quot;/XCommand parameter&amp;quot; ...] [Script.nsi | - [...]]&lt;br /&gt;
* /LICENSE - license page를 보여준다.&lt;br /&gt;
* /Vx (x는 0~4) - output 의 표시 정도를 조절한다.&lt;br /&gt;
	0 : no output&lt;br /&gt;
	1 : errors only&lt;br /&gt;
	2 : warnings and errors&lt;br /&gt;
	3 : info, warnings, and errors&lt;br /&gt;
	4 : all output&lt;br /&gt;
* /Olog (log 는 filename) - compile 중 screen 상에 해당 화일에 대한 log를 표시하는 대신 화일로 설정한다.&lt;br /&gt;
* /PAUSE - Makensis 가 종료되기 전 중간에 일시정지해준다. 이는 Windows 에서 직접 실행할 때 유용하다.&lt;br /&gt;
* /NOCONFIG - nsisconfi.nsi 을 포함하지 않는다. 이 파라메터가 없는 경우, 인스톨러는 기본적으로 nsisconf.nsi 로부터 기본설정이 세팅된다. (NSIS Configuration File 참조)&lt;br /&gt;
* /CMDHELP - command 에 대한 기본적인 사용정보를 출력해준다.&lt;br /&gt;
&lt;br /&gt;
하지만 거의 기본 옵션이상 잘 안쓰게 될 것이다. ^^;&lt;br /&gt;
=== 효율적인 개발작업환경 ===&lt;br /&gt;
NSIS 는 인스톨하고 난 뒤에는 오른쪽버튼 shell-extension 에 해당 확장자 컴파일이 등록된다. 하지만 command 로 수동으로 옵션을 설정하면서 입력해주는 것이 더 편하다.&lt;br /&gt;
&lt;br /&gt;
또는 Editplus 의 사용자도구그룹에 makensis 을 등록시켜서 사용하는 방법도 있겠다. (nsis 를 위한 간단한 ide 만들어서 써먹어보는중.. 이였지만. 엉엉.. 그래도 editplus 가 훨 편하긴 하다. --;)&lt;br /&gt;
=== .NSI script 기본 문법 ===&lt;br /&gt;
NSIS Script File (.nsi) 는 command 들의 묶음인 batch-file와도 같아보이는 text file이다.&lt;br /&gt;
* ; 나 # 으로 시작되는 행들은 전부 comment 이다.&lt;br /&gt;
* ;, # 뒤에 나오는 것 또한 comment 로 취급된다.&lt;br /&gt;
* 주석이 아닌 행들은 &amp;#039;command &amp;amp;#91;parameter&amp;amp;#93;&amp;#039; 의 형태를 띤다.&lt;br /&gt;
* parameter 의 숫자들은 10진수, 16진수, 8진수들을 이용할 수 있다. (일반 숫자, 0x__, 0124 식으로..)&lt;br /&gt;
* 표현하고자하는 string 에 공백이 있으면 따옴표를 이용한다.&lt;br /&gt;
 ex)&lt;br /&gt;
 	MessageBox MB_OK &amp;quot;I&amp;#039;ll be happy&amp;quot; ; this one puts a &amp;#039; inside a string&lt;br /&gt;
 	MessageBox MB_OK &amp;#039;And he said to me &amp;quot;Hi there!&amp;quot;&amp;#039; ; this one puts a &amp;quot; inside a string&lt;br /&gt;
 	MessageBox MB_OK `And he said to me &amp;quot;I&amp;#039;ll be fucked!&amp;quot;` ; this one puts both &amp;#039; and &amp;quot;s inside a string:&lt;br /&gt;
* 하나의 command 가 여러줄을 이용하는 경우 &amp;#039;&amp;#039; 를 사용한다.&lt;br /&gt;
     CreateShortCut &amp;quot;$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk&amp;quot; \&lt;br /&gt;
                    &amp;quot;$INSTDIR\source\zip2exe\zip2exe.dsw&amp;quot;&lt;br /&gt;
     MessageBox MB_YESNO|MB_ICONQUESTION \&lt;br /&gt;
                &amp;quot;Remove all files in your NSIS directory? (If you have anything \&lt;br /&gt;
 you created that you want to keep, click No)&amp;quot; \&lt;br /&gt;
                 IDNO NoRemoveLabel&lt;br /&gt;
&lt;br /&gt;
=== NSI Script Study ===&lt;br /&gt;
NSIS 는 스크립트 기반으로 일종의 배치화일과 같으므로, 예제위주의 접근을 하면 쉽게 이용할 수 있다. [[NSIS/예제1]], [[NSIS/예제2]], [[NSIS/예제3]] 등을 분석하고 소스를 조금씩 용도에 맞게 수정하여 작성하면 쉽게 접근할 수 있을 것이다. 의문이 생기는 명령어나 속성(attribute)에 대해서는 [[NSIS/Reference]] 를 참조하기 바란다.&lt;br /&gt;
&lt;br /&gt;
=== CHM Document ===&lt;br /&gt;
NSIS 의 windows installer 버전을 설치하면 NSIS.CHM 화일이 같이 있다.&lt;br /&gt;
&lt;br /&gt;
=== NSIS 에서 인스톨 중 Explorer 창 전부 닫기 ===&lt;br /&gt;
http://nsis.sourceforge.net/archive/nsisweb.php?page=111&amp;amp;instances=0,11&lt;br /&gt;
http://nsis.sourceforge.net/archive/nsisweb.php?page=633&amp;amp;instances=0,110&lt;br /&gt;
&lt;br /&gt;
=== 해당 dll 들 system32 의 디렉토리에 복사해주기 ===&lt;br /&gt;
 ;copy files&lt;br /&gt;
 File /r `.\tmp\*.*`&lt;br /&gt;
 ;system32 에 복사해줄 dll 들도 일단 복사해준다.&lt;br /&gt;
 File /r `.\AdditionalDLL\*.dll` &lt;br /&gt;
 &lt;br /&gt;
 ;move system addtinoal dlls to system folder&lt;br /&gt;
 Rename &amp;quot;$INSTDIR\MSVCP60.dll&amp;quot; &amp;quot;$SYSDIR\MSVCP60.dll&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== windows 깔린 위치 찾아오기 ===&lt;br /&gt;
이용 예 : windows 의 system32 디렉토리에 dll 들을 복사해줄 때.&lt;br /&gt;
&lt;br /&gt;
 Section &amp;quot;ThisNameIsIgnoredSoWhyBother?&amp;quot; &lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   MessageBox MB_OK &amp;quot;$WINDIR&amp;quot;&lt;br /&gt;
   MessageBox MB_OK &amp;quot;$SYSDIR&amp;quot;&lt;br /&gt;
   ; 복사할 화일을 추가하기. &lt;br /&gt;
 SectionEnd ; section 완료 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExecWait ===&lt;br /&gt;
exec 로 해당 프로세스를 실행할 때 해당 프로세스가 죽을 때 까지 wait.&lt;br /&gt;
regsvr32.exe 로 dll 을 unregister 한 다음에 전체 폴더를 삭제할 때, regsvr32.exe 는 Exec 가 아닌 ExecWait 로 실행해주어야 한다. (그렇지 않으면 해당 dll 이 unregister 되기 전에 dll 화일이 delete 되어 정상적인 uninstall 이 되지 않을 수도 있다.)&lt;br /&gt;
&lt;br /&gt;
=== NSIS 에서 특정 Process 가 살아있는지 여부 확인 ===&lt;br /&gt;
FindProc Plugin 을 설치한다.&lt;br /&gt;
&lt;br /&gt;
http://nsis.sourceforge.net/archive/download.php?file=FindProc.zip&lt;br /&gt;
&lt;br /&gt;
사용 예 : exec 로 regsvr32.exe 호출시 비동기 호출이 되어 뒤의 delete 문이 실행된다. 이를 방지하기 위한 방법으로 다음과 같이 한다.&lt;br /&gt;
&lt;br /&gt;
   Exec &amp;#039;regsvr32.exe /u /s &amp;quot;$INSTDIR\COMDLL.dll&amp;quot;&amp;#039;&lt;br /&gt;
   waitloop:&lt;br /&gt;
     FindProcDLL::FindProc &amp;quot;regsvr32.exe&amp;quot;&lt;br /&gt;
     IntCmp $R0 0 waitdone&lt;br /&gt;
     Sleep 500&lt;br /&gt;
     Goto waitloop&lt;br /&gt;
   waitdone:&lt;br /&gt;
 &lt;br /&gt;
   Delete &amp;quot;$INSTDIR\*.*&amp;quot;&lt;br /&gt;
   RMDir /r &amp;quot;$INSTDIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== NSIS 에서 ActiveX Component 등록하기 ===&lt;br /&gt;
http://nsis.sourceforge.net/archive/viewpage.php?pageid=435&lt;br /&gt;
 ;Inside the -Post section&lt;br /&gt;
 Exec &amp;#039;regsvr32.exe /s &amp;quot;$INSTDIR\${NAME_OF_MY_DLL}&amp;quot;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 ;And Inside the Uninstall Section &lt;br /&gt;
 Exec &amp;#039;regsvr32.exe /s /u &amp;quot;$INSTDIR\${NAME_OF_MY_DLL}&amp;quot;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NSIS 에서 uninstall.exe 만들기 ===&lt;br /&gt;
http://nsis.sourceforge.net/archive/viewpage.php?pageid=117&lt;br /&gt;
&lt;br /&gt;
할 일 : 1. &amp;#039;Uninstall&amp;#039; Section 을 만든다. 2. WriteInstaller 를 이용해준다.&lt;br /&gt;
&lt;br /&gt;
 ;--------------------------------    &lt;br /&gt;
 ;Uninstaller Section  &lt;br /&gt;
 Section &amp;quot;Uninstall&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
 ;Delete Files &lt;br /&gt;
   RMDir /r &amp;quot;$INSTDIR\*.*&amp;quot;    &lt;br /&gt;
  &lt;br /&gt;
 ;Remove the installation directory&lt;br /&gt;
   RMDir &amp;quot;$INSTDIR&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 ;Delete Start Menu Shortcuts&lt;br /&gt;
   Delete &amp;quot;$DESKTOP\${MUI_PRODUCT}.lnk&amp;quot;&lt;br /&gt;
   Delete &amp;quot;$SMPROGRAMS\${MUI_PRODUCT}\*.*&amp;quot;&lt;br /&gt;
   RmDir  &amp;quot;$SMPROGRAMS\${MUI_PRODUCT}&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
 ;Delete Uninstaller And Unistall Registry Entries&lt;br /&gt;
   DeleteRegKey HKEY_LOCAL_MACHINE &amp;quot;SOFTWARE\${MUI_PRODUCT}&amp;quot;&lt;br /&gt;
   DeleteRegKey HKEY_LOCAL_MACHINE&lt;br /&gt;
 &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}&amp;quot;  &lt;br /&gt;
   &lt;br /&gt;
 SectionEnd&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;&amp;quot;&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 &lt;br /&gt;
 ;레지스트리에 uninstall 프로그램 셋팅해주는 부분&lt;br /&gt;
 ;write uninstall information to the registry&lt;br /&gt;
   WriteRegStr HKLM&lt;br /&gt;
 &amp;quot;Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}&amp;quot;&lt;br /&gt;
 &amp;quot;DisplayName&amp;quot; &amp;quot;${MUI_PRODUCT} (remove only)&amp;quot;&lt;br /&gt;
   WriteRegStr HKLM&lt;br /&gt;
 &amp;quot;Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}&amp;quot;&lt;br /&gt;
 &amp;quot;UninstallString&amp;quot; &amp;quot;$INSTDIR\Uninstall.exe&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; Uninstaller 를 만드는 부분 &lt;br /&gt;
 WriteUninstaller &amp;quot;$INSTDIR\Uninstall.exe&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 SectionEnd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Thread ==&lt;br /&gt;
--&amp;amp;#91;fnwinter&amp;amp;#93; 형 고마워여~ NSIS 쓰는거 정리 할 필요가 있었는 데 , PS 이거 말고도 INNO SETUP 이라는 프로그램이 있거든요. 그것도 괜찮은데, 한번 써보세요~&lt;br /&gt;
  몇몇 유틸리티 인스톨러에서 InnoSetup 쓰는거 종종 보였었는데, 이것도 공짜였군..~ 그나저나, http://isfd.kaju74.de/index.php?screenshots . 너무 뽀대나는거 아냐?;; --&amp;amp;#91;1002&amp;amp;#93;&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>