개발을 하다보면 셋업프로그램을 만들어야 하는 경우가 발생합니다.
또한 업데이트에 대한 고민도 해야 합니다.
그중 하나인 셋업에 대한 부분 중 제가 만든 것을 약간 정리해봤습니다
도움이 되었으면 합니다
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
;-----------------------------------------------------------------------------------------------------------------------
;##### 제품 이름, 버전, 업데이트 버전, 레지스트리 등록이름, 업체명, 업체 URL, 업체 홈페이지 표시 이름, 런타임 명
;-----------------------------------------------------------------------------------------------------------------------
!define PRODUCT_NAME "제품명" ;예)블럭노리
!define PRODUCT_VERSION "버전정보" ;예) 1.0
!define APP_AUTORUN_REGNAME "레지스트리 등록이름" ; 시스템 시작시 자동 시작 레지스트리 이름
!define PRODUCT_PUBLISHER "제작사" ;예) New & Now Inc.
!define PRODUCT_WEB_SITE "웹사이트 주소" ;예) http://www.newnnow.co.kr
!define HOMEPAGE_NAME "바탕화면 홈페이지 단축아이콘 명" ;예)New & Now 홈페이지
!define RUNTIME_VERSION "Adobe AIR"
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 완료 후 실행파일명
;-----------------------------------------------------------------------------------------------------------------------
!define APP_EXENAME "실행파일명" ;예) 어플최초 실행명 Blocknori.exe
;-----------------------------------------------------------------------------------------------------------------------
;##### 레지스트리 등록을 위한 정보
;-----------------------------------------------------------------------------------------------------------------------
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_EXENAME}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_AUTORUN_REGNAME}"
!define PRODUCT_PASSDIR_REGKEY "Software\${APP_AUTORUN_REGNAME}"
!define PRODUCT_UNINST_RUNTIME "Software\Microsoft\Windows\CurrentVersion\Uninstall\${RUNTIME_VERSION}"
!define COMMON_REGKEY "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
;-----------------------------------------------------------------------------------------------------------------------
;##### MUI 1.67 compatible
;-----------------------------------------------------------------------------------------------------------------------
!include "MUI.nsh"
!include "sections.nsh"
!include "Library.nsh"
!include "MUI2.nsh"
!include "OLEDB.NSH"
!include "LogicLib.nsh"
!include "WordFunc.nsh"
;-----------------------------------------------------------------------------------------------------------------------
;##### MUI Settings
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_ABORTWARNING
!define MUI_ICON ".\icon\install.ico" ;설치아이콘
!define MUI_UNICON ".\icon\uninstall.ico" ;삭제아이콘
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 환영 메세지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\images\welcome.bmp" ;환영 페이지의 배경(190*290)
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH ;환영 페이지의 배경을 늘리지 않음
!define MUI_WELCOMEPAGE_TITLE "새로운 디자인과 기능으로 업그레이드된\r\n블럭노리 설치를 시작합니다."
!define MUI_WELCOMEPAGE_TEXT "아래 [다음] 버튼을 누르시면 설치가 시작됩니다."
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 헤더 메세지
;-----------------------------------------------------------------------------------------------------------------------
;!define MUI_HEADERIMAGE
;!define MUI_HEADERIMAGE_BITMAP ".\head.bmp" ; 헤드이미지(150*57)
;!define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_PAGE_HEADER_TEXT " 블럭노리 사용자 이용약관"
!define MUI_PAGE_HEADER_SUBTEXT "- 블럭노리을 설치하시기 전에 사용자 이용약관 내용을 살펴보시기 바랍니다."
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 약관 메세지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_LICENSEPAGE_TEXT_TOP "블럭노리 사용자 이용약관 동의 사항의 나머지 부분을 보시려면 [Page Down] 키를 눌러주세요." ;
!define MUI_LICENSEPAGE_TEXT_BOTTOM "내용에 동의하셨다면 '동의함'을 눌러주세요. 블럭노리을 설치하기 위해서는 반드시 내용에 동의하셔야 합니다."
!define MUI_TEXT_COMPONENTS_TITLE " 블럭노리 설치 구성 요소 선택"
!define MUI_TEXT_COMPONENTS_SUBTITLE "- 설치하고자 하는 블럭노리을의 구성 요소를 선택해 주세요."
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE " "
!define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO " "
!define MUI_TEXT_INSTALLING_TITLE " 블럭노리 설치중"
!define MUI_TEXT_INSTALLING_SUBTITLE "- 블럭노리을 설치하는 동안 잠시 기다려 주세요."
;-----------------------------------------------------------------------------------------------------------------------
;##### Instfiles page
;-----------------------------------------------------------------------------------------------------------------------
!insertmacro MUI_PAGE_WELCOME ;환영 페이지
!insertmacro MUI_PAGE_LICENSE ".\license\License.rtf" ;라이센스 페이지
!insertmacro MUI_PAGE_COMPONENTS
;Page components
!insertmacro MUI_PAGE_INSTFILES
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 완료후 보여질 페이지
;-----------------------------------------------------------------------------------------------------------------------
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_EXENAME}"
!define MUI_FINISHPAGE_TITLE "블럭노리 설치 완료."
!define MUI_FINISHPAGE_TEXT "블럭노리을 설치해주셔서 감사합니다."
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 언어
;-----------------------------------------------------------------------------------------------------------------------
!insertmacro MUI_LANGUAGE "Korean"
;-----------------------------------------------------------------------------------------------------------------------
;##### 관리자 권한 획득
;-----------------------------------------------------------------------------------------------------------------------
RequestExecutionLevel admin
;-----------------------------------------------------------------------------------------------------------------------
;##### 제품명, 실행파일 생성위치, 인스톨 위치 지정
;-----------------------------------------------------------------------------------------------------------------------
Name "${PRODUCT_NAME}"
OutFile "..\Setup\$제품명_Setup.exe"
InstallDir "$LOCALAPPDATA\${PRODUCT_NAME}"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "passdir"
ShowInstDetails show
ShowUnInstDetails show
;-----------------------------------------------------------------------------------------------------------------------
;##### 전역 변수 선언
;-----------------------------------------------------------------------------------------------------------------------
Var VER
var MACAddress
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치 프로그램이 나타나기 전에 수행할 함수
;-----------------------------------------------------------------------------------------------------------------------
Function .onInit
#인터넷 연결 유무 체크
Pop $1
System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1'
StrCmp "$1" "1" inetA
StrCmp "$1" "0" inetB
goto chkend
inetA:
Pop $6
ReadRegStr "$6" HKLM "${PRODUCT_UNINST_RUNTIME}" "VersionMajor" ; Adobe Air 버전 비교
StrCmp "$6" "2" skipA skipB
goto tend
;-----------------------------------------------------------------------------------------------------------------------
;##### 인터넷을 통하여 런타임 다운로드 후 설치함
;-----------------------------------------------------------------------------------------------------------------------
skipA:
goto tend
skipB:
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "프로그램 설치를 위해서 Adobe Air v2.0 이상이 반드시 설치되어야만 합니다.$\n$\nAdobe Air를 설치하시겠습니까?" IDYES +3
MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "설치가 종료되었습니다."
Abort
SetOutPath "$INSTDIR"
InetLoad::load /POPUP "Adobe Air 다운로드중" "http://airdownload.adobe.com/air/win/download/latest/AdobeAIRInstaller.exe" "AdobeAIRInstaller.exe"
Pop $0 # return value = exit code, "OK" if OK
StrCmp "$0" "OK" setupA
MessageBox MB_OK|MB_ICONEXCLAMATION "Adobe Air다운로드에 실패했습니다. 설치를 중단합니다." /SD IDOK
Abort
setupA:
ExecWait "$INSTDIR\AdobeAIRInstaller.exe"
Delete "$INSTDIR\AdobeAIRInstaller.exe"
SetAutoClose true
RMDir /r "$INSTDIR"
goto tend
tend:
Push $6
ReadRegStr "$6" HKLM "${PRODUCT_UNINST_RUNTIME}" "DisplayName" ; 기존버전 설치유뮤 확인
StrCmp "$6" "${RUNTIME_VERSION}" skipC
StrCmp "$6" "" skipD
goto send
skipC:
Pop $5
## 기존 버전이 있는지 확인
ReadRegStr "$5" HKLM "${PRODUCT_UNINST_KEY}" "DisplayVersion"
StrCmp "$5" "${PRODUCT_VERSION}" initA
StrCmp "$5" "" "0" initB
StrCpy "$VER" "0"
Goto send
initA:
MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "$(^Name) 가(이) 이미 설치되었습니다.$\n$\n설치가 종료됩니다."
Abort
Goto end
initB:
StrCpy "$VER" "1"
Goto end
end:
Push $5
Push $VER
goto send
skipD:
MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "프로그램 설치를 위해서 Adobe Air가 반드시 설치되어야만 합니다.$\n$\nAdobe Air를 설치 후 다시 시도해주세요.$\n$\n설치가 종료됩니다."
Abort
goto send
send:
Push $6
goto chkend
inetB:
MessageBox MB_ICONQUESTION|MB_DEFBUTTON1 "인터넷이 연결되어 있지 않습니다..$\n$\n인터넷 연결 후 다시 시도해주세요.$\n$\n설치가 종료됩니다."
Abort
goto chkend
chkend:
Push $1
FunctionEnd
;설치실패시
Function .onInstFailed
;-----------------------------------------------------------------------------------------------------------------------
;##### 실행중인 프로그램이 있으면 강제 종료
;-----------------------------------------------------------------------------------------------------------------------
FindProcDLL::FindProc "${APP_EXENAME}"
StrCmp $R0 1 mfound notmfound
mfound:
KillProcDLL::KillProc "${APP_EXENAME}"
notmfound:
Delete "$INSTDIR\*.*"
RMDir /r "$INSTDIR"
~ ~ ~ ~ ~ ~ ~
SetAutoClose true
FunctionEnd
;-----------------------------------------------------------------------------------------------------------------------
;##### 파일 복사 및 레지스트리 등록, 아이콘 생성
;-----------------------------------------------------------------------------------------------------------------------
Section "블럭노리 설치" SEC01
;-----------------------------------------------------------------------------------------------------------------------
;##### 실행중인 프로그램이 있으면 강제 종료
;-----------------------------------------------------------------------------------------------------------------------
FindProcDLL::FindProc "${APP_EXENAME}"
StrCmp $R0 1 mfound notmfound
mfound:
KillProcDLL::KillProc "${APP_EXENAME}"
notmfound:
SectionIn RO ; 필수설치표시
;-----------------------------------------------------------------------------------------------------------------------
;##### 파일 복사
;-----------------------------------------------------------------------------------------------------------------------
SetOutPath "$INSTDIR"
File "..\source\*.*"
~ ~ ~ ~ ~ ~ ~
ndllfound:
;-----------------------------------------------------------------------------------------------------------------------
;##### 설치후 실행파일 실행
;-----------------------------------------------------------------------------------------------------------------------
; Exec "$INSTDIR\${APP_EXENAME}"
SetAutoClose true
SectionEnd
; Optional section (can be disabled by the user)
;Section "컴퓨터 시작시 자동실행"
; CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "unvisible" "$INSTDIR\${APP_EXENAME}" 0
; WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "${APP_AUTORUN_REGNAME}" '$INSTDIR\${APP_EXENAME} unvisible'
;SectionEnd
Section "바탕화면 아이콘 생성"
; SetShellVarContext all
SetOutPath "$INSTDIR"
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "" "$INSTDIR\${APP_EXENAME}" 0
SectionEnd
Section -AdditionalIcons
; SetShellVarContext all
SetOutPath "$INSTDIR"
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$STARTMENU\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}"
CreateShortCut "$STARTMENU\${PRODUCT_NAME}\${PRODUCT_NAME} 삭제.lnk" "$INSTDIR\uninst.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} 삭제.lnk" "$INSTDIR\uninst.exe"
CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "unvisible" "$INSTDIR\${APP_EXENAME}" 0
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
; SetShellVarContext all
SetOutPath "$INSTDIR"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_NAME}" '$INSTDIR\${APP_EXENAME} unvisible'
WriteRegStr HKCU "${PRODUCT_PASSDIR_REGKEY}" "DisplayIcon" "$INSTDIR\${APP_EXENAME}"
~ ~ ~ ~ ~ ~ ~
SectionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "${PRODUCT_NAME}을 삭제하시겠습니까?" IDYES +2
Abort
FunctionEnd
Section Uninstall
FindProcDLL::FindProc "${APP_EXENAME}"
StrCmp $R0 1 mfound notmfound
mfound:
KillProcDLL::KillProc "${APP_EXENAME}"
notmfound:
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
~ ~ ~ ~ ~ ~ ~
Delete "$INSTDIR\*.*"
RMDir /r "$INSTDIR"
Delete "$STARTMENU\${PRODUCT_NAME}.lnk"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
DeleteRegKey HKCU "${PRODUCT_PASSDIR_REGKEY}"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_NAME}"
DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\${PRODUCT_NAME}_RASAPI32"
DeleteRegKey HKLM "SOFTWARE\Microsoft\Tracing\${PRODUCT_NAME}_RASMANCS"
SetShellVarContext all
Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*"
SetAutoClose true
SectionEnd