===== 기본 형식 =====
{{:tool:nsis:default.nsi|}}
++++ 코드 펼치기 |
# 반복되는 키워드를 DEFINE으로 설정
!define PRODUCT_NAME "sampleApp"
# 언인스톨에서 사용할 DEFINE
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_NAME "${PRODUCT_NAME} Uninstall"
# 컴파일 시간 - 파일 이름에 붙이려는 용도
!define /date STR_DATE_NOW "%Y%m%d"
!define /date STR_TIME_NOW "%H%M"
# 원본 파일 위치
!define SRC_BEGIN_PATH "."
!define SRC_FOLDER_PATH "ReleaseFiles"
; MUI 1.67 compatible ------
!include "MUI2.nsh"
; MUI Settings
!define MUI_ABORTWARNING
#!define MUI_ICON "${PRODUCT_NAME}.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
#필요하면 되살리기 - 설치 종료후 앱 실행
#!define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_NAME}.exe"
# 사용할 페이지들
!insertmacro MUI_PAGE_WELCOME
#!insertmacro MUI_PAGE_LICENSE "SWLicence.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
# 설치 화면 왼쪽 하단의 nsis 로고 삭제
BrandingText " "
; MUI end ------
Name "${PRODUCT_NAME}"
OutFile "${PRODUCT_NAME}-setup-(${STR_DATE_NOW}-${STR_TIME_NOW}).exe"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
# 설치 과정 보여주기
ShowInstDetails show
ShowUnInstDetails hide
RequestExecutionLevel admin /* RequestExecutionLevel REQUIRED! */
#----------------------------------------------------------------------------------------------------------------------
#!insertmacro CreateInternetShortcut \
# "$STARTMENU\NSIS homepage" \
# "http://www.nsis.sf.net" \
# "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" "0"
## "${FILENAME}.URL" --> URL extension must be capitalized. (Big arphabet),
## '${FILENAME}.url' --> not worked, or worked strange.
#
!macro CreateInternetShortcut FILENAME URL ICONFILE ICONINDEX
Delete "${FILENAME}.URL"
WriteINIStr "${FILENAME}.URL" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILENAME}.URL" "InternetShortcut" "IconFile" "${ICONFILE}"
WriteINIStr "${FILENAME}.URL" "InternetShortcut" "IconIndex" "${ICONINDEX}"
!macroend
#----------------------------------------------------------------------------------------------------------------------
# 바탕화면에 아이콘을 만들거나 인터넷 바로가기를 만들거나
Function makeShortcutOrInternetshortcut
# 프로그램 그룹 만들기
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
# 프로그램 그룹에 언인스톨 링크 추가
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_UNINST_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}-uninst.exe"
# 프로그램 그룹에 내 프로그램 등록
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
# 바탕화면에 링크 만들기
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
# 인터넷 주소
#!insertmacro CreateInternetShortcut "$DESKTOP\${STR_HANGAME_WEBURL_TITLE}" "${PRODUCT_HGC_WEB_SITE}" "$INSTDIR\${PRODUCT_ENG_NAME}.ico" "0"
FunctionEnd
#----------------------------------------------------------------------------------------------------------------------
# 삭제용 매크로
!macro removeAllFiles
RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
!macroend
#----------------------------------------------------------------------------------------------------------------------
# 설치할 파일을 어디에 설치할 것인지 알려주는 설치 주 스크립트
Section
# 기존 설치 내용 삭제
!insertmacro removeAllFiles
SetOverwrite try
SetOutPath "$INSTDIR"
File /r "${SRC_BEGIN_PATH}\${SRC_FOLDER_PATH}\*.*"
# 특정 파일을 무시하고 싶으면
#File /r /x "파일이름" "${SRC_BEGIN_PATH}\${SRC_FOLDER_PATH}\*.*"
Call MakeShortcutOrInternetshortcut
SectionEnd
# 파일 복사가 끝나면 필요한 작업 수행 - 언인스톨 정보 추가하기.
Section .onInstSuccess
; SAVE UNISNTALL INFORMATION
WriteUninstaller "$INSTDIR\${PRODUCT_NAME}-uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\${PRODUCT_NAME}-uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_NAME}.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${STR_DATE_NOW}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "http://www.google.com/"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_NAME}"
Call makeShortcutOrInternetshortcut
SectionEnd
;------------------------------------------------------------------------------------------------------------------------------------------
; Uninstall section
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name)は削除されました。"
FunctionEnd
Function un.onInit
FunctionEnd
Section Uninstall
!insertmacro removeAllFiles
SetAutoClose true
SectionEnd
++++
===== 설치 파일 이름 일부를 읽어서, 동작 변경하도록 =====
#뒤의 세문자를 읽어서, 다음 동작을 결정한다.
Function MakeShortcutOrInternetshortcut
# $0 : 저장할 임시 변수
# $EXEFILE : 설치파일 실행 이름
# 3 : 복사할 최대 문자수는 3글자
# -3 : 맨 끝에서부터 -3 글자 위치에서부터 복사 시작
StrCpy $0 $EXEFILE 3 -3
MessageBox MB_OK "get the : $0"
# $0에 저장된 문자가 ARA면 계속실행, 아니면 nextOne으로 점프
StrCmp $0 "ARA" 0 nextOne
CreateShortCut "$DESKTOP\${STR_GAME_NAME}.lnk" "$INSTDIR\${LAUNCHER_EXE_NAME}"
goto done
nextOne:
# $0에 저장된 문자가 HGC면 계속 실행, 아니면 nextTwo으로 점프
StrCmp $0 "HGC" 0 nextTwo
!insertmacro CreateInternetShortcut "$DESKTOP\${STR_GAME_NAME}" "${STR_WEB_SITE}" "$INSTDIR\${STR_GAME_NAME}.ico" "0"
goto done
nextTwo:
# for later usage
MessageBox MB_OK "no choice"
done:
# done
FunctionEnd
===== 폴더 선택 대화상자를 출력하는 예 =====
# 레지스트리에서 폴더 위치를 읽어와야 하는데 못 읽는 경우, 폴더 선택 화면을 띄운다.
Var strGamePath ; game path
Function getGamePath
ReadRegStr $strGamePath HKCU "Software\TestApp" "testapppath"
StrCmp $strGamePath "" InitFailed InitSuccess
Quit
InitFailed:
MessageBox MB_OK "APP이 설치된 폴더를 찾을 수 없습니다. 폴더를 선택해주시길."
# 폴더 선택 대화 상자 열기
nsDialogs::SelectFolderDialog "ゲームが設置されたフォルダ選択" "$PROGRAMFILES\testapppath"
# 리턴값을 스택에서 받아오기
Pop $strGamePath
# 빈 문자열이면 에러 처리
StrCmp $strGamePath "" 0 InitSuccess
MessageBox MB_OK "quit Install"
Quit
InitSuccess:
; MessageBox MB_OK "$strGamePath" ; (dbg msg)
WriteRegStr HKCU "Software\TestApp" "testapppath" $strGamePath
; go installation
FunctionEnd
===== 스트링에 줄바꾸기 추가 =====
MessageBox MB_OK "1st line $\r$\n 2nd line"