스크립트 안의 메일은 출처본이기 때문에 그대로 둔다.
nodepad++ 등과 같은 프로그램을 이용해 NSIS 언어로 보는것을 추천!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 | ############################################################################################################# ## ## 2004-01-09 새로운 구조로 최초 작성 ## 01-29 템플릿 구성 시작 ## 10-05 NOTEPAD 샘플 작성 ## ## NSIS 예제 파일 작성 : hardkoder@gmail.com ( www.kipple.pe.kr ) ## ############################################################################################################# # 기본 내용 설정 (언어 종속) !define TXT_NAME_K "메모장" ; 프로그램 이름 !define TXT_PUBLISHER_K "키플" ; 프로그램 추가/제거에 보일 publisher 이름 !define TXT_LNKNAME_K "메모장" ; 프로그램 그룹의 링크 이름 !define TXT_PROGRAM_GROUP_NAME_K "키플" ; 프로그램 그룹 이름 !define TXT_BRANDING_K "메모장 설치" ; 하단 branding text !define TXT_COPANY_NAME_K "키플" ; 인스톨러에 표시될 회사 이름 !define TXT_UNINST_DISPNAME_K "메모장" ; 언인스톨러에 표시될 이름 !define TXT_UNINST_LNKNAME_K "프로그램 제거" ; 언인스톨러 링크 이름 !define TXT_HOMEPAGE_URL_K "http://www.kipple.pe.kr" ; 홈페이지 주소 !define TXT_LICENSE_FILENAME_K "_license.rtf" ; 라이센스 파일이름 !define TXT_VI_COMPANY_NAME_K "키플" ; 버전정보 - 회사명 !define TXT_VI_COPYRIGHT_K "저작권(C) 2004 키플" ; - 저작권 정보 !define TXT_PROGRAM_GROUP_PARENT_K "키플" ; 프로그램 그룹 이름 # 한글 특화 부분 - 이름에 따라서 바꿔주자. !define EUL_RUL "를" ; 을/를 문제 해결을 위한 define. $PRODUCT 에 따라 바뀐다. !define I_KA "이" ; 이/가 문제 해결을 위한 define. $PRODUCT 에 따라 바뀐다. !define KOREAN_RUL ; mui 외의 부분에서 을/를 문제가 발생하는것을 해결하기 위한부분- NSIS2.0 패치가 적용되어야 작동한다. #!define KOREAN_EUL ; # 기본 내용 설정 (언어 비종속) !define APP_VER "V1.0 베타" ; 프로그램 버전 !define APP_INSTDIR "NOTEPAD" ; Program Files 에 설치될 폴더 이름. ;!define APP_COMPANYDIR "KIPPLE" ; Program Files\COMPANY NAME\PROGRAM NAME 에 설치될 경우 - 안쓸경우 NULL string("") 대신 주석처리하도록 한다. !define APP_REGPOS "SOFTWARE\KIPPLE\NOTEPAD" ; 설치 폴더가 저장될 위치, 프로그램이 HKCU 에 데이타 저장하는 레지스트리 - 언인스톨시 삭제될 레지스트리 위치 !define APP_OUTNAME "NOTEPADSETUP.EXE" ; setup 파일명 !define APP_CLASSNAME "Notepad" ; app class name !define APP_EXENAME "NOTEPAD.EXE" ; 설치 완료후 실행될 실행 파일 이름 !define APP_UNINST_ICON ${APP_EXENAME} ; 언인스톨러에 표시될 아이콘 !define APP_UNINST_REGNAME "NOTEPAD" ; 언인스톨 정보가 저장될 레지스트리 위치 !define APP_UNINST_EXENAME "uninstall.exe" ; 언인스톨러 이름 !define APP_AUTORUN_REGNAME "NOTEPAD" ; 시스템 시작시 자동 시작 레지스트리 이름 !define APP_ROOT_KEY "HKLM" ; 설치정보를 저장할 위치를 지정 - HKLM 혹은 HKCU !define APP_AUTORUN_ROOT_KEY "HKCU" ; 자동 실행시 저장할 위치를 지정 - HKLM 혹은 HKCU !define APP_SHELL_VAR_CONTEXT_PROGG "all" ; 프로그램 그룹 SetShellVarContext 에서 사용할 파라메터 (all|current) !define APP_SHELL_VAR_CONTEXT_ICON "current" ; 단축아이콘 생성 SetShellVarContext 에서 사용할 파라메터 (all|current) !define APP_AUTORUN_SHELL_VAR_CTX "current" ; "시스템 시작시 자동 실행"시 SetShellVarContext 에서 사용할 파라메터 (all|current) !define APP_VI_PRODUCT_VER "1.0.0.1" ; 버전정보 - 버전 # section 설정 #!define CFG_SEC_AUTORUN ; AUTORUN SECTION 사용 여부 #!define CFG_SEC_AUTORUN_USE_REG ; AUTORUN 에 REGISTRY 를 사용할지 여부 - 안쓰면 단축아이콘으로 등록된다. #!define CFG_SEC_AUTORUN_SECTIONIN "1" ; AUTORUN SECTION 영역 지정 #!define CFG_SEC_AUTORUN_AUTORUN_PARAM "" ; AUTORUN 할때 시작 파라메터 지정 !define CFG_SEC_DESKTOPICON ; 바탕화면 아이콘 생성 !define CFG_SEC_QUICKLAUNCHICON ; 빠른 실행 아이콘 생성 #!define CFG_SEC_STARTMENUICON ; 시작 메뉴 아이콘 생성 #!define CFG_SEC_HOMEPAGE ; 홈페이지 !define CFG_ETC_SPLASH ; splash 사용 여부 !define CFG_ETC_SPLASH_FILENAME "_splash.bmp" ; SPLASH 파일명. !define CFG_ETC_SPLASH_FADEIN "1000" ; splash fade in 시간 (ms) !define CFG_FUNC_AUTOINSTALL ; "/A" 옵션으로 Auto Install 지원 여부 - 사용하려면 NSISAutoSetupPlugin.dll 이 필요하다. ;!define CFG_FUNC_CHECKNT ; 프로그램이 NT(2000/XP) 전용일 경우 경고 메시지 출력 ##### MUI 기본 정의 ######################################################################################### SetCompress off ; 압축 여부(auto|force|off) ( off 로 놓으면 테스트 하기 편하다 ) SetCompressor lzma ; 압축방식 (zlib|bzip2|lzma) ##### 기본 INCLUDE ########################################################################################## !include "MUI.nsh" ; MUI 사용을 위해서.. !include "sections.nsh" ; section selection 매크로 사용 !define MUI_CUSTOMFUNCTION_GUIINIT .muiCustomGuiInit ; MUI 커스텀 GUI INIT 함수 정의 ##### MUI 처리 ############################################################################################## # MUI 기본 설정 ;!define MUI_COMPONENTSPAGE_SMALLDESC ; 설치 옵션 설명칸이 작게.. !define MUI_COMPONENTSPAGE_NODESC ; 설치 옵션 설명칸 없음 !define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_EXENAME}" ; 종료후 프로그램 자동 실행 여부 물어 보기 ;!define MUI_FINISHPAGE_RUN_NOTCHECKED ; 자동 실행을 기본적으로 체크 안하길 원할경우. !define MUI_UNFINISHPAGE_NOAUTOCLOSE ; 언인스톨 종료시 자동으로 닫히지 않게 하기. #!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico" #!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico" !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis1-uninstall.ico" # MUI 기본 설정 (잘 안쓰는것들) #!define MUI_FINISHPAGE_RUN_NOTCHECKED ; 자동 실행을 기본적으로 체크 안하길 원할경우. #!define MUI_HEADERBITMAP_RIGHT ; 헤더 비트맵을 오른쪽에 표시 #!define MUI_ABORTWARNING ; 설치 취소시 경고 메시지 뿌리기 #!define MUI_INSTALLCOLORS "FFFFFF 000000" ; 설치 화면 글자/배경색 지정 #!define MUI_PROGRESSBAR colored !define MUI_HEADERIMAGE ; HEADER 비트맵 보일까 말까 여부. !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\header\win-k.bmp" ; 상단 이미지 # MUI 페이지 설정 (contrib\Modern UI\Readme.html 참조) !insertmacro MUI_PAGE_WELCOME ; 시작 환영 페이지 !insertmacro MUI_PAGE_LICENSE $(TXT_LICENSE_FILENAME) ; 저작권 !insertmacro MUI_PAGE_COMPONENTS ; 컴포넌트 선택 !insertmacro MUI_PAGE_DIRECTORY ; 디렉토리 선택 !insertmacro MUI_PAGE_INSTFILES ; 설치중 !insertmacro MUI_PAGE_FINISH ; 종료 페이지 보이기 !insertmacro MUI_UNPAGE_CONFIRM ; 언인스톨 !insertmacro MUI_UNPAGE_INSTFILES ; 파일 삭제 진행 상황 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; 뭘까??? !insertmacro MUI_LANGUAGE "Korean" ; 언어 설정. ##### 커스텀 콜백 함수 ###################################################################################### # GUI 초기화에서 호출 Function My_GuiInit ;call CheckNt ; NT 전용 어플리케이션 메시지 FunctionEnd # Section_Copy 에서 파일 복사. Function My_CopyFile ; 기존에 실행중인 프로그램 종료. Push ${APP_CLASSNAME} Call CheckAndCloseApp ; 파일 복사 SetOutPath $INSTDIR File .\NOTEPAD.EXE ; 여기에 설치를 원하는 파일을 나열한다. ; 서브디렉토리에도 파일 설치를 원할경우 아래와 같은 방법을 사용한다. ;SetOutPath $INSTDIR\subdir ;File .\subdir\subfile.dll FunctionEnd # Section_CreateProgramGroup 에서 프로그램 링크 추가 Function My_CreateProgramGroup #CreateShortCut "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)\${TXT_NAME_K}.lnk" "$INSTDIR\${APP_EXENAME}" "" "" 0 FunctionEnd # uninstall 작업 수행 Function un.My_Uninstall ; 기존에 실행중인 프로그램 종료. Push ${APP_CLASSNAME} Call un.CheckAndCloseApp Sleep 1000 ; 파일 삭제 Delete $INSTDIR\notepad.exe RMDir $INSTDIR\ FunctionEnd ############################################################################################################# ##### 여기부터 템플릿 : 별로 변경할 필요가 없다는 뜻 ####################################################### ############################################################################################################# ##### 텍스트 설정 ########################################################################################### LangString TXT_NAME ${LANG_KOREAN} "${TXT_NAME_K}" LangString TXT_PUBLISHER ${LANG_KOREAN} "${TXT_PUBLISHER_K}" LangString TXT_LNKNAME ${LANG_KOREAN} "${TXT_LNKNAME_K}" LangString TXT_PROGRAM_GROUP_NAME ${LANG_KOREAN} "${TXT_PROGRAM_GROUP_NAME_K}" LangString TXT_PROGRAM_GROUP_PARENT ${LANG_KOREAN} "${TXT_PROGRAM_GROUP_PARENT_K}" LangString TXT_HOMEPAGE_URL ${LANG_KOREAN} "${TXT_HOMEPAGE_URL_K}" LangString TXT_BRANDING ${LANG_KOREAN} "${TXT_BRANDING_K}" LangString TXT_COPANY_NAME ${LANG_KOREAN} "${TXT_COPANY_NAME_K}" LangString TXT_UNINST_DISPNAME ${LANG_KOREAN} "${TXT_UNINST_DISPNAME_K}" LangString TXT_UNINST_LNKNAME ${LANG_KOREAN} "${TXT_UNINST_LNKNAME_K}" LicenseLangString TXT_LICENSE_FILENAME ${LANG_KOREAN} "${TXT_LICENSE_FILENAME_K}" # 설치파일 버전 정보 VIProductVersion "${APP_VI_PRODUCT_VER}" VIAddVersionKey "ProductName" "${TXT_NAME_K}" VIAddVersionKey "Comments" "${TXT_NAME_K} 설치 파일 (${__DATE__} ${__TIME__})" VIAddVersionKey "FileDescription" "${TXT_NAME_K} 설치 파일" VIAddVersionKey "FileVersion" "${APP_VER}" VIAddVersionKey "CompanyName" "${TXT_VI_COMPANY_NAME_K}" VIAddVersionKey "LegalCopyright" "${TXT_VI_COPYRIGHT_K}" #VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "${TXT_NAME_E}" #VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "${TXT_NAME_E} Setup File (${__DATE__} ${__TIME__})" #VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "${TXT_NAME_E} Setup File" #VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${APP_VER}" #VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "${TXT_VI_COMPANY_NAME_E}" #VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "${TXT_VI_COPYRIGHT_E}" # 고정 내용 설정 (언어 종속) LangString TXT_DEFAULT_INSTALL ${LANG_KOREAN} "기본설치" LangString TXT_DEFAULT_REINSTALL ${LANG_KOREAN} "재설치" # 언어 설정 LangString TXT_SECTION_COPY ${LANG_KOREAN} "프로그램 파일 복사" LangString TXT_SECTION_PROGRAMGROUP ${LANG_KOREAN} "프로그램 그룹 생성" LangString TXT_SECTION_LAUNCHWHENSYSTEMRUN ${LANG_KOREAN} "윈도우 시작시 자동 시작" LangString TXT_SECTION_CREATEDESKTOPICON ${LANG_KOREAN} "바탕 화면에 단축 아이콘 생성" LangString TXT_SECTION_CREATEQUICKLAUNCH ${LANG_KOREAN} "빠른 실행 단축 아이콘 생성" LangString TXT_SECTION_CREATSTARTMENU ${LANG_KOREAN} "시작 메뉴 단축 아이콘 생성" LangString TXT_SECTION_OPENHOMEPAGE ${LANG_KOREAN} "홈페이지 열기" LangString TXT_DELETE_ALL_FILES ${LANG_KOREAN} "프로그램이 설치된후 생성된 파일등이 설치 폴더($INSTDIR)에 일부 남아 있습니다.$\r$\n$\r$\n 프로그램이 설치 되었던 폴더를 완전히 삭제하시겠습니까?" LangString TXT_STILLRUN_EXIT_PROGRAM ${LANG_KOREAN} "실행중 입니다. 프로그램을 먼저 종료해 주세요." LangString TXT_THIS_IS_NT_ONLY_APP ${LANG_KOREAN} "이 프로그램은 Windows NT/2000/xp/2003 에서만 실행됩니다." LangString TXT_NEED_ADMIN_PRIVILEGE ${LANG_KOREAN} "이 프로그램은 시스템의 관리자 권한(Administrator)을 가진 사용자만이 설치할 수 있습니다.$\r$\n$\r$\n관리자 권한이 없을경우 정상 설치되지 않습니다.$\r$\n$\r$\n설치를 중단하시겠습니까?" ##### NSIS 기본 설정######################################################################################### # NSIS 기본 설정 ShowInstDetails show ; 설치내용 자세히 보기 여부(hide|show|nevershow) ShowUninstDetails show ; 언인스톨 자세히 보기 여부(hide|show|nevershow) AutoCloseWindow true ; 완료후 설치프로그램 자동 닫기 AllowRootDirInstall false ; 루트 폴더에 설치하지 못하도록 한다. CRCCheck on ; 시작시 CRC 검사를 한다. (디폴트) (on|off|force) SetOverwrite on ; 파일 복사시 기본적으로 덮어쓰기 한다(디폴트) (on|off|try|ifnewer) XPStyle on ; xp manifest 사용 여부 Name "$(TXT_NAME) ${APP_VER}" ; 기본 이름 OutFile "${APP_OUTNAME}" ; 출력 파일 InstType "$(TXT_DEFAULT_INSTALL)" ; 기본 설치 타입 종류 InstType "$(TXT_DEFAULT_REINSTALL)" BrandingText "$(TXT_BRANDING)" ; 하단 인스톨러 텍스트 바꿀때 사용 LicenseBkColor F5F5FF ; 라이센스 배경 컬러 !ifdef APP_COMPANYDIR InstallDir "$PROGRAMFILES\${APP_COMPANYDIR}\${APP_INSTDIR}" ; 기본 설치 폴더 선택 !else InstallDir "$PROGRAMFILES\${APP_INSTDIR}" ; 기본 설치 폴더 선택 !endif ##### SECTION 정의 ########################################################################################## ## 기본 파일 복사 ## Section !$(TXT_SECTION_COPY) Section_Copy ; 파일 복사 섹션 ( ! 로 시작되면 BOLD 표시 ) SectionIn 1 2 RO ; 설치 섹션 "RO" 는 Read Only (해제 불가) ; custom 파일 카피 Call My_CopyFile ; 설치 위치 정보 저장 ( HKCU 와 HKLM 두군에 다 ) WriteRegStr HKCU ${APP_REGPOS} "ProgramFolder" "$INSTDIR" WriteRegStr HKCU ${APP_REGPOS} "ProgramPath" "$INSTDIR\${APP_EXENAME}" WriteRegStr HKLM ${APP_REGPOS} "ProgramFolder" "$INSTDIR" WriteRegStr HKLM ${APP_REGPOS} "ProgramPath" "$INSTDIR\${APP_EXENAME}" ; 실행파일 등록 WriteRegStr ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_EXENAME}" "" '"$INSTDIR\${APP_EXENAME}"' WriteRegStr ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_EXENAME}" "Path" '"$INSTDIR\${APP_EXENAME}"' ; 언인스톨 정보 WriteRegStr ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINST_REGNAME}" "DisplayName" "$(TXT_UNINST_DISPNAME)" WriteRegStr ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINST_REGNAME}" "UninstallString" '"$INSTDIR\${APP_UNINST_EXENAME}"' WriteRegStr ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINST_REGNAME}" "DisplayIcon" '"$INSTDIR\${APP_UNINST_ICON}"' ; 언인스톨러 생성 WriteUninstaller "$INSTDIR\${APP_UNINST_EXENAME}" ; 언인스톨러 만들기 SectionEnd ## 프로그램 그룹 생성 ## Section $(TXT_SECTION_PROGRAMGROUP) Section_CreateProgramGroup SectionIn 1 2 ; 폴더 생성 SetShellVarContext ${APP_SHELL_VAR_CONTEXT_PROGG} ; 프로그램 폴더 설치시 "현재사용자" 에게만 설치할 것인지 "모든 사용자" 에게 설치할 것인지를 결정 (current|all) SetOutPath "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)\" SetOutPath $INSTDIR CreateShortCut "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)\$(TXT_LNKNAME).lnk" "$INSTDIR\${APP_EXENAME}" "" "" 0 CreateShortCut "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)\$(TXT_UNINST_LNKNAME).lnk" "$INSTDIR\${APP_UNINST_EXENAME}" "" "" 0 ; 콜백함수 호출 Call My_CreateProgramGroup SectionEnd ## 바탕화면 아이콘 ## !ifdef CFG_SEC_DESKTOPICON Section $(TXT_SECTION_CREATEDESKTOPICON) Section_CreateDesktopShortcut SectionIn 1 call GetParameters ; /S 옵션을 사용할 경우.. SetCurInstType 처리가 정상작동 안하므로 강제로 처리하기.. Pop $0 StrCmp $0 "/S" 0 Next StrCmp $8 "first" Next return ; not first !!! Next: ; 바탕화면 아이콘 생성 SetShellVarContext ${APP_SHELL_VAR_CONTEXT_ICON} SetOutPath $INSTDIR CreateShortCut "$DESKTOP\$(TXT_LNKNAME).lnk" "$INSTDIR\${APP_EXENAME}" "" "" 0 ;WriteINIStr "$DESKTOP\$(TXT_LNKNAME).url" "InternetShortcut" "URL" "${TXT_HOMEPAGE_URL_K}" ;WriteINIStr "$DESKTOP\$(TXT_LNKNAME).url" "InternetShortcut" "IconFile" "$INSTDIR\${APP_EXENAME}" ;WriteINIStr "$DESKTOP\$(TXT_LNKNAME).url" "InternetShortcut" "IconIndex" "0" SectionEnd !endif ## 빠른 실행 아이콘 ## !ifdef CFG_SEC_QUICKLAUNCHICON Section $(TXT_SECTION_CREATEQUICKLAUNCH) Section_CreateQuickLaunchShortcut SectionIn 1 call GetParameters ; /S 옵션을 사용할 경우.. SetCurInstType 처리가 정상작동 안하므로 강제로 처리하기.. Pop $0 StrCmp $0 "/S" 0 Next StrCmp $8 "first" Next return ; not first !!! Next: ; 빠른 실행에 단축 아이콘 생성 SetShellVarContext ${APP_SHELL_VAR_CONTEXT_ICON} SetOutPath $INSTDIR CreateShortCut "$QUICKLAUNCH\$(TXT_LNKNAME).lnk" "$INSTDIR\${APP_EXENAME}" "" "" 0 SectionEnd !endif ## 시작 메뉴 단축 아이콘 ## !ifdef CFG_SEC_STARTMENUICON Section $(TXT_SECTION_CREATSTARTMENU) Section_CreateStartmenuShortcut SectionIn 3 ; 시작 메뉴에 단축 아이콘 생성 SetShellVarContext ${APP_SHELL_VAR_CONTEXT_ICON} SetOutPath $INSTDIR CreateShortCut "$STARTMENU\$(TXT_LNKNAME).lnk" "$INSTDIR\${APP_EXENAME}" "" "" 0 SectionEnd !endif ## 윈도우 시작시 자동 시작 등록 ## !ifdef CFG_SEC_AUTORUN Section $(TXT_SECTION_LAUNCHWHENSYSTEMRUN) Section_LaunchWhenSystemRun SectionIn ${CFG_SEC_AUTORUN_SECTIONIN} !ifndef CFG_SEC_AUTORUN_AUTORUN_PARAM !define CFG_SEC_AUTORUN_AUTORUN_PARAM "" !endif !ifdef CFG_SEC_AUTORUN_USE_REG ; 레지스트리 등록하는 방법 WriteRegStr ${APP_AUTORUN_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Run" "${APP_AUTORUN_REGNAME}" '"$INSTDIR\${APP_EXENAME}" ${CFG_SEC_AUTORUN_AUTORUN_PARAM}' !else ; 시작프로그램에 단축아이콘 등록하는 방법 SetShellVarContext ${APP_AUTORUN_SHELL_VAR_CTX} ; 전체 사용자, 현재 사용자 여부 (current|all) CreateShortCut "$SMSTARTUP\$(TXT_LNKNAME).lnk" "$INSTDIR\${APP_EXENAME} ${CFG_SEC_AUTORUN_AUTORUN_PARAM}" "" "" 0 !endif ; CFG_SEC_AUTORUN_USE_REG SectionEnd !endif ; CFG_SEC_AUTORUN ## 홈페이지 ## !ifdef CFG_SEC_HOMEPAGE Section $(TXT_SECTION_OPENHOMEPAGE) Section_OpenHomepage SectionIn 3 Exec '"explorer" "$(TXT_HOMEPAGE_URL)"' SectionEnd !endif ; CFG_SEC_HOMEPAGE ## 언인스톨 ## Section "Uninstall" ; 커스텀 uninstall 작업 처리 Call un.My_Uninstall ; uninstall 파일 지우기. Delete "$INSTDIR\${APP_UNINST_EXENAME}" ; 설치된 폴더 지우기. RMDir "$INSTDIR" ; 파일이 아직 남아 있으면.. IfFileExists $INSTDIR\*.* 0 SkipDel MessageBox MB_ICONINFORMATION|MB_YESNO $(TXT_DELETE_ALL_FILES) IDNO SkipDel RMDir /r "$INSTDIR" RMDir /REBOOTOK "$INSTDIR" SkipDel: ; 설치 위치 및 APP 정보 삭제 DeleteRegKey HKLM ${APP_REGPOS} DeleteRegKey HKCU ${APP_REGPOS} ; 탐색기 메뉴 삭제 DeleteRegKey HKEY_CLASSES_ROOT "Directory\shell\GomAudio.Play" DeleteRegKey HKEY_CLASSES_ROOT "Directory\shell\GomAudio.Add" ; 프로그램 그룹 지우기 SetShellVarContext ${APP_SHELL_VAR_CONTEXT_PROGG} ; 설치할때 프로그램 그룹이 설치된 위치. RMDir /r "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)" ; 프로그램 그룹 지우기 StrCmp $(TXT_PROGRAM_GROUP_PARENT) "" Skip RMDir "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_PARENT)" Skip: ; 실행파일 등록 지우기 DeleteRegKey ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_EXENAME}" SetShellVarContext current ; current 시작 단축 아이콘 지우기 Delete "$SMSTARTUP\$(TXT_LNKNAME).lnk" Delete "$DESKTOP\$(TXT_LNKNAME).lnk" ; 바탕화면 단축 아이콘 Delete "$DESKTOP\$(TXT_LNKNAME).url" ; 바탕화면 단축 아이콘 Delete "$QUICKLAUNCH\$(TXT_LNKNAME).lnk" ; 빠른 실행 Delete "$STARTMENU\$(TXT_LNKNAME).lnk" ; 시작 메뉴 SetShellVarContext all ; all 시작 단축 아이콘 지우기 Delete "$SMSTARTUP\$(TXT_LNKNAME).lnk" Delete "$DESKTOP\$(TXT_LNKNAME).lnk" ; 바탕화면 단축 아이콘 Delete "$DESKTOP\$(TXT_LNKNAME).url" ; 바탕화면 단축 아이콘 Delete "$QUICKLAUNCH\$(TXT_LNKNAME).lnk" ; 빠른 실행 Delete "$STARTMENU\$(TXT_LNKNAME).lnk" ; 시작 메뉴 ; 언인스톨 정보 지우기 DeleteRegKey ${APP_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINST_REGNAME}" ; 자동 시작 정보 지우기 DeleteRegValue ${APP_AUTORUN_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Run" "${APP_AUTORUN_REGNAME}" SectionEnd ; "Uninstall" ##### 내부 함수 ############################################################################################# ## 초기화 작업 하기 ## Function .onInit ; 스플래쉬 처리 !ifdef CFG_ETC_SPLASH ReserveFile "${CFG_ETC_SPLASH_FILENAME}" ; solid compressing 을 위한 file reserve ReserveFile "${NSISDIR}\Plugins\advsplash.dll" ClearErrors ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion IfErrors NotNT ; 98 에서는 가끔 뻗는다. NT 가 아니면 splash 를 보이지 않게 한다. SetOutPath $TEMP File /oname=spltmp.bmp ${CFG_ETC_SPLASH_FILENAME} ;File /oname=spltmp.wav "splashshit.wav" ; 사운드 출력할라면.. advsplash::show 2000 ${CFG_ETC_SPLASH_FADEIN} 0 0xff00ff $TEMP\spltmp ; (delay, fadein, fadeout, keycolor, filename) Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normal, and '-1' if some error occured. Delete $TEMP\spltmp.bmp ;Delete $TEMP\spltmp.wav NotNT: !endif ; CFG_ETC_SPLASH ; 기존 설치된 폴더를 찾는다. ReadRegStr $R0 "${APP_ROOT_KEY}" "${APP_REGPOS}" "ProgramFolder" ; 기존에 설치된 폴더 찾기 StrCmp $R0 "" Skip ; 기존 설치 정보가 없으면 skip IfFileExists "$R0\*.*" 0 Skip ; 기존폴더에 파일이 없으면 skip ReadRegStr $INSTDIR "${APP_ROOT_KEY}" "${APP_REGPOS}" "ProgramFolder" ; 설치 폴더를 기존 설치 폴더로 세팅 return Skip: StrCpy $8 "first" ; 처음 설치 여부 변수 세팅 - 처음이다.. FunctionEnd ## GUI 초기화 할때 처리 ## Function .muiCustomGuiInit call My_GuiInit ; custom init call CheckAccountType ; ADMIN 권한을 가지고 있는지 체크한다. !ifdef CFG_FUNC_AUTOINSTALL ; /A 옵션 처리 call GetParameters call CheckAndRunAutoInstall !endif ; 설치가 반복될때 바탕화면 아이콘등이 반복적으로 설치되는것을 막고자 할때 아래 코드를 사용한다. ; 이전 프로그램 설치 여부를 레지스트리 존재 여부로 판단한다. ReadRegStr $R0 HKLM "${APP_REGPOS}" "ProgramFolder" ; 기존에 설치된 폴더 찾기 StrCmp $R0 "" End ; $R0 가 "" 이면 goto End ; 이미 이전에 설치된 적이 있었기 때문에 불필요한 단축 아이콘을 만들지 않도록 한다. SetCurInstType 1 ; "재설치" 타입 세팅. return End: SetCurInstType 0 ; "기본설치" 타입 세팅 FunctionEnd ## 설치 성공후 ## Function .onInstSuccess ; 프로그램 그룹 보여주기 ; Exec '"explorer" "$SMPROGRAMS\$(TXT_PROGRAM_GROUP_NAME)\"' FunctionEnd ##### 유틸 함수 ############################################################################################# ;---------------------------------------------------------------------------------------- ; 프로그램의 클래스를 이용하여서 프로그램이 실행중인지 체크하고, 종료시킨다. ; 호출전 Push 로 꼭 함수 이름을 보내줘야 한다. Function CheckAndCloseApp Pop $R0 ; GET WINDOW CLASS NAME loop1: FindWindow $R1 "$R0" IntCmp $R1 0 done1 SendMessage $R1 16 0 0 ; WM_CLOSE SendMessage $R1 2 0 0 ; WM_DESTROY Sleep 3000 FindWindow $R1 "$R0" IntCmp $R1 0 done1 MessageBox MB_OK "$(TXT_NAME)${I_KA} $(TXT_STILLRUN_EXIT_PROGRAM)" goto loop1 done1: FunctionEnd ;---------------------------------------------------------------------------------------- ; NT 전용 프로그램일 경우 NT 전용 경고 메시지 출력 함수 !ifdef CFG_FUNC_CHECKNT Function CheckNt Push $R0 ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion StrCmp $R0 "" win9x Pop $R0 return win9x: MessageBox MB_OK $(TXT_THIS_IS_NT_ONLY_APP) Pop $R0 abort FunctionEnd !endif ; CFG_FUNC_CHECKNT ;---------------------------------------------------------------------------------------- ; 어드민여부를 체크하고, 경고메시지 출력후 설치를 중단한다 ; contrib\UserInfo\userinfo.nsi 참고 Function CheckAccountType ReserveFile "${NSISDIR}\Plugins\UserInfo.dll" ; solid compressing 을 위한 file reserve ClearErrors UserInfo::GetName IfErrors done ; win9x 이다.. Pop $0 UserInfo::GetAccountType Pop $1 StrCmp $1 "Admin" done 0 ; admin 이면 ok MessageBox MB_YESNO $(TXT_NEED_ADMIN_PRIVILEGE) IDNO done abort ; 설치 중단. done: FunctionEnd ;---------------------------------------------------------------------------------------- ; 프로그램의 클래스를 이용하여서 프로그램이 실행중인지 체크하고, 종료시킨다. ; 호출전 Push 로 꼭 윈도우 클래스 이름을 보내줘야 한다. ; uninstall 전용 Function un.CheckAndCloseApp Pop $R0 ; GET WINDOW CLASS NAME loop1: FindWindow $R1 "$R0" IntCmp $R1 0 done1 ;SendMessage $R1 16 0 0 ; WM_CLOSE SendMessage $R1 2 0 0 ; WM_DESTROY Sleep 3000 FindWindow $R1 "$R0" IntCmp $R1 0 done1 MessageBox MB_OK "$(TXT_NAME)${I_KA} $(TXT_STILLRUN_EXIT_PROGRAM)" goto loop1 done1: FunctionEnd ;---------------------------------------------------------------------------------------- ; command line param 을 구한다. ; input, none ; output, top of stack (replaces, with e.g. whatever) ; modifies no other variables. !ifdef CFG_FUNC_AUTOINSTALL Function GetParameters Push $R0 Push $R1 Push $R2 Push $R3 StrCpy $R2 1 StrLen $R3 $CMDLINE ;Check for quote or space StrCpy $R0 $CMDLINE $R2 StrCmp $R0 '"' 0 +3 StrCpy $R1 '"' Goto loop StrCpy $R1 " " loop: IntOp $R2 $R2 + 1 StrCpy $R0 $CMDLINE 1 $R2 StrCmp $R0 $R1 get StrCmp $R2 $R3 get Goto loop get: IntOp $R2 $R2 + 1 StrCpy $R0 $CMDLINE 1 $R2 StrCmp $R0 " " get StrCpy $R0 $CMDLINE "" $R2 Pop $R3 Pop $R2 Pop $R1 Exch $R0 FunctionEnd !endif ; CFG_FUNC_AUTOINSTALL ;---------------------------------------------------------------------------------------- ; /A 옵션으로 실행하면 ; 자동 실행을 처리한다. !ifdef CFG_FUNC_AUTOINSTALL Function CheckAndRunAutoInstall ReserveFile "${NSISDIR}\Plugins\NSISAutoSetupPlugin.dll" ; solid compressing 을 위한 file reserve Pop $0 StrCmp $0 "/A" 0 END SetOutPath $TEMP ; 임시 폴더에 플러그인 복사후 ;File NSISAutoSetupPlugin.dll ;CallInstDLL $TEMP\NSISAutoSetupPlugin.dll /NOUNLOAD StartAutoSetup ; 플러그인 처리 NSISAutoSetupPlugin::StartAutoSetup /NOUNLOAD END: FunctionEnd !endif ; CFG_FUNC_AUTOINSTALL | cs |
'프로그래밍 > NSIS' 카테고리의 다른 글
NSIS 제어판에서 삭제하면 폴더가 사라지지 않음 (0) | 2017.04.20 |
---|---|
[펌] NSIS 기본적인 사용방법 (0) | 2017.04.04 |
NSIS 플러그인 적용하기 (0) | 2017.04.03 |
NSIS User Manual (0) | 2017.04.03 |