Auto-uninstall old before installing new

From NSIS Wiki

Author: codehistorian (talk, contrib)


This is a code snippet you can put into your .onInit function that will detect whether your software is already installed and, if so, allows the user to uninstall it first.

In the source below, we use the define ${PROGRAM_NAME} to be the name of the product as well as the name of the installer/uninstaller. You can either define this define or search/replace it. If you name your uninstaller or registry location differently, you should change those strings accordingly.

Function .onInit
 
  ReadRegStr $R0 HKLM \
  "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROGRAM_NAME}" \
  "UninstallString"
  StrCmp $R0 "" done
 
  MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
  "${PROGRAM_NAME} is already installed. $\n$\nClick `OK` to remove the \
  previous version or `Cancel` to cancel this upgrade." \
  IDOK uninst
  Abort
 
;Run the uninstaller
uninst:
  ClearErrors
  ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
 
  IfErrors no_remove_uninstaller done
    ;You can either use Delete /REBOOTOK in the uninstaller or add some code
    ;here to remove the uninstaller. Use a registry key to check
    ;whether the user has chosen to uninstall. If you are using an uninstaller
    ;components page, make sure all sections are uninstalled.
  no_remove_uninstaller:
 
done:
 
FunctionEnd

The following variant lets the uninstaller remove itself, so the IfErrors block is not needed any more:

  Exec $INSTDIR\uninst.exe ; instead of the ExecWait line
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

* 이전에 작성한 indeo 코덱 설치하기 포스트도 참고하세요 *
2009/03/12 - [기타] - [NSIS] 비스타에서 인스톨 할 때 indeo 코덱 설치하기.

3월 12일에 nsis에서 인디오 코덱을 설치하는 과정을 포스팅 한 적이 있습니다.
이번에 게임에서 사용하는 동영상 코덱이 변경되어, 이를 추가기록 합니다.

xvid는 오픈소스 프로젝트로, http://xvid.org 에서 인스톨러나 소스를 다운받을 수 있습니다.
인스톨러 셋업파일은 기본 UI 지원방식 이지만 /SILENT 와 /VERYSILENT 옵션을 지원합니다.

  • /SILENT 옵션은 버튼 조작과정은 없지만 진행과정을 표시하는 UI가 출력되고,
  • /VERYSILENT 옵션은 진행과정표시 UI도 출력되지 않고 인스톨되는 방식입니다.


xvid의 설치는 자체 인스톨러의 옵션 지원으로, 이전 indeo 설치과정보다 더 심플하게 가능합니다.


하지만 위의 방식은 단순하게 배포본 xvid 코덱 셋업파일을 같이 실행시키는 것 뿐이라... 게임 플레이엔 지장이 없겠지만 깔끔한 처리방식은 아닙니다. 정말 게임에 지장이 없을 최소스펙으로만 인스톨 하려면 xvid.ax 파일만을 등록(regsvr32) 해주면 되는듯 하군요.

http://www.msfn.org/board/lofiversion/index.php/t7771.html

간결한 버전으로의 인스톨 수정은 기존 indeo 코덱 처리와 비슷할 듯 하니 (스크린샷 참고),
요청이 들어오면 어렵지 않게 수정 될듯 하네요 :)

[수정, 090903] 실제 xvid 동영상 재생만을 위해서는 xvid.ax, xvidcore.dll 두 개의 파일만 있으면 됩니다. 인스톨러 설치가 아닌 디코더만 설치할때는 아래처럼 처리하면 됩니다.


그나저나 우리 프로젝트는 반디 동영상 재생 라이브러리 ( http://www.bandisoft.com/bandi_video_library/ ) 를 구매하기로 했군요;;

여태 삽질한 코덱 설치는 그냥 좋은 추억거리공부거리로...... -┌)...

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

우리 게임에서는 캐릭터 설명을 위한 동영상을 재생합니다.
유저 컴퓨터에서 동영상을 제대로 재생하기 위해서는 코덱이 설치되어 있어야 하죠.
오늘 받은 오류 레포트 중에서 인스톨시 indeo 코덱을 설치하다 발생하는 오류에 대한 이슈가 있어서
이를 해결하고 기록을 남기기 위해 포스팅 합니다.


정확한 원인은 파악하지 못했지만 비스타의 경우, 기본으로 설치된 ir50_32.dll이 약간 비정상적인 상태로 존재할 때가 있습니다.
system32 경로 아래 있는 ir50_32.dll을 덮어쓰려고 하거나, 리네임(rename), 삭제(delete) 등 수정을 가하는 액션을 취하면 권한이 필요하다며 작업이 되지 않는 케이스가 그것인데요. 이런 경우 nsis에서 파일을 덮어쓰려고 하면 위와 같은 오류가 발생합니다.

그러니 사실 NSIS의 문제는 아니지요. 비스타 문제인지... indeo 코덱이 문제인지... 혹은 파일 보호 및 보안 차원에서 의도된 처리인지... 조금은 궁금하지만 그건 out of bussiness 입니다. 제가 필요한건 게임이 오류 없이 install 되고, 플레이에 지장이 없으면 되거든요.

위와 같은 경우는 그냥 아래와 같이 파일 복사 절차를 건너 뛰어 주면 그만이더군요.



내일이 우리 게임 ( http://karcass.co.kr ) 2차 클베 하는 날입니다!
대박 나서 돈 많이 벌었음 좋겠어요!!
Posted by leafbird 트랙백 1 : 댓글 1

댓글을 달아 주세요

  1. addr | edit/del | reply Favicon of https://devnote.tistory.com BlogIcon leafbird 2009.09.03 14:55 신고

    /*
    # 코덱삭제
    UnRegDLL "$SYSDIR\ir50_32.dll"
    Delete "$SYSDIR\ir50_32.dll"
    */



reference :
http://kin.naver.com/knowhow/entry.php?d1id=3&dir_id=3&eid=jqpkwn4ECfIr/4mMJo06yrqC1Uwf0DUv&qb=bnNpcyB1bmluc3RhbGw=

NSIS 스크립트 예제>

=========================================================================================

 

;NSIS Modern User Interface
;Eocs (굴단::Nuke팀::헌터)
;Written by Eocs (=Arian2u,4u=SJWannabe=DeadlyAngel)

;★★★--------------------------------
;Include Modern UI
  !include "MUI.nsh" ; ◀ Modern UI 의 헤더파일입니다.

                             ; (Modern UI 는 최근의 윈도에서 사용되는 마법사와 같은 형태의

                             인터페이스를 갖추고 있습니다.)

;★★★--------------------------------
;General

 ;Name and file
  Name "Nuke UI Ver 0.7 베타" ; ◀ 셋업 실행시 상단에 나타날 프로그램 명칭입니다.
  OutFile "Nuke_Setup.exe" ; ◀ 셋업파일명을 지정해줍니다.

 ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\Nuke UI Beta" "" ; ◀ 레지스트리에 등록합니다.
 
;★★★--------------------------------
;Interface Settings
  !define MUI_ABORTWARNING

 

;★★★--------------------------------
;Pages
 !insertmacro MUI_PAGE_LICENSE $(myLicenseData) ; ◀ 아래의 A) LicenseData와 맞물려

                                                                             한글 txt 파일을 읽어들입니다.
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
 
;★★★--------------------------------
;Languages
 !define EUL_RUL "를"       ;한글 (을)(를) 처리 ; ◀ 한글 (을)(를)처리를 수정해줍니다.
 !insertmacro MUI_LANGUAGE "Korean" ; ◀ 기본 언어를 한글로 설정합니다.
 
 ;Reserve Files
  !insertmacro MUI_RESERVEFILE_LANGDLL
 
 LicenseLangString myLicenseData ${LANG_KOREAN} "${NSISDIR}\Docs\Modern UI\License_NukeUI_KR.txt"
 LicenseData $(myLicenseData) ; ◀ A) LicenseLangString과 함께 사용하여 라이센스

                                              정보를 한글 파일로 사용할 수 있도록 합니다.

 

;★★★--------------------------------
;함수 내에서만 실행되는 것들 처리
Function .onInit         ;onInit
 ;WOW가 설치된 경로 가져오기
 ReadRegStr $INSTDIR HKEY_LOCAL_MACHINE "SOFTWARE\Blizzard Entertainment\World of Warcraft" "InstallPath" ; ◀ 레지스트리의 값을 읽어서 $INSTDIR에 저장합니다.
 ;중복실행 방지
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "NukeUI_Beta_0.7") i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
   MessageBox MB_OK|MB_ICONEXCLAMATION "NukeUI 0.7 설치를 위한 인스톨러가 이미 실행중입니다. - Eocs (굴단::Nuke팀::헌터) -" ; ◀ Mutex를 만들어 중복실행을 방지합니다.
   Abort
FunctionEnd

 

;★★★--------------------------------
;Default installation folder
 InstallDir $INSTDIR ; ◀ 기본 설정 경로를 지정합니다.
 
;★★★--------------------------------
;Installer Sections - 필수 애드온 (UnitFrame 관련, Raid 관련, Sct, SpellAllert 등...)
Section "!필수(공통) 기능" GR_COMMON ; ◀ !가 들어간 Section의 문자열은 굵게 나타납니다.
 SectionIn RO ; ◀ 필수 선택으로 Read Only
 
  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\NukeUI "Install_Dir" "$INSTDIR" ; ◀ 인스톨 경로를 레지스트리에

                                                                                           등록합니다.
 
  ; Write the uninstall keys for Windows

  ; ◀ 아래의 4줄은 Uninstall 정보를 레지스트리에 등록합니다.
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "DisplayName" "Nuke UI Ver 0.7 베타"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "UninstallString" '"$INSTDIR\Uninstall_NukeUI.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI" "NoRepair" 1
 WriteUninstaller "$INSTDIR\Uninstall_NukeUI.exe"
 
 ;Start Menu Shortcuts ; ◀ 프로그램 그룹에 등록하고, 언인스톨의 바로가기 아이콘을 만듭니다.
  CreateDirectory "$SMPROGRAMS\Nuke UI Ver 0.7 베타"
  CreateShortCut "$SMPROGRAMS\Nuke UI Ver 0.7 베타\Nuke UI 언인스톨(제거).lnk" "$INSTDIR\Uninstall_NukeUI.exe" "" "$INSTDIR\Uninstall_NukeUI.exe" 0

 

 ;Remove And Create Directory
  RMDir /r "$INSTDIR\Interface" ; Interface(AddOns) 폴더 삭제 ; ◀ /r 옵션은 하위폴더를 포함
 RMDir /r "$INSTDIR\WTF" ; WTF(Account) 폴더 삭제
 CreateDirectory "$INSTDIR\Interface"  ; Interface(AddOns) 폴더 생
 CreateDirectory "$INSTDIR\WTF"    ; WTF(Account) 폴더 생성
 
 ;필수(공통) 애드온 설치
 SetOutPath "$INSTDIR\Interface\AddOns\!ImprovedErrorFrame"
 File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\!ImprovedErrorFrame\" ; ◀ /r 옵션으로 모두 포함
 SetOutPath "$INSTDIR\Interface\AddOns\!StopTheSpam"
 ;이하 생략 합니다.

 ;.

 ;.

 ;.


 ;WTF\Account 폴더에 설정 파일 설치
 SetOutPath "$INSTDIR\WTF\Account\계정이름입력"
 File /r "..\..\..\..\Account(NukeUI 0.7배포)\계정이름입력\"
SectionEnd

 

;★★★--------------------------------
;Installer Sections - 타이탄 패널과 플러그인
SectionGroup /e "타이탄 패널" GR_TITAN ; ◀ /e 옵션은 Expand입니다. 옵션을 확장시킵니다.
 Section "타이탄 기본" SecTitan
  SectionIn RO
  SetOutPath "$INSTDIR\Interface\AddOns\Titan"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\Titan\"
  SetOutPath "$INSTDIR\Interface\AddOns\TitanAmmo"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanAmmo\"
  SetOutPath "$INSTDIR\Interface\AddOns\TitanBag"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanBag\"
  SetOutPath "$INSTDIR\Interface\AddOns\TitanClock"
  File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanClock\"
  ;이하 생략합니다.

  ;.

  ;.

  ;.
 SectionEnd
 SectionGroup "타이탄 추가" GR_T_PLUGIN
  Section "경험치표시" SecTitanXPStatus
   SectionIn RO
   SetOutPath "$INSTDIR\Interface\AddOns\TitanXPStatus"
   File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanXPStatus\"
  SectionEnd 
  Section /o "어그로경고" SecTitanAggro
   SetOutPath "$INSTDIR\Interface\AddOns\TitanAggro"
   File /r "..\..\..\..\AddOns(NukeUI 0.7배포)\TitanAggro\"
  SectionEnd
  ;이하 생략합니다.

  ;.

  ;.

  ;.
 SectionGroupEnd
SectionGroupEnd ; ◀ SectionGroup내에 여러 Section과 하위 SectionGroup이 있습니다.
 
;★★★--------------------------------

; 이하 SectionGroup과 Section들 생략합니다.

;.

;.

;.


 

;★★★--------------------------------
;Descriptions

 

  ;Language strings ; ◀ 각 섹션그룹과 섹션의 설명(툴팁) 문자열을 지정합니다.
 LangString DESC_GR_COMMON ${LANG_KOREAN} "Nuke UI Ver 0.7 베타의 공통 라이브러리 입니다.(필수)"
 LangString DESC_GR_TITAN ${LANG_KOREAN} "타이탄 패널입니다. WOW 화면 상하단에 유용한 기능들을 제공합니다. (필수+선택)"
 LangString DESC_GR_T_PLUGIN ${LANG_KOREAN} "타이탄 패널용 플러그인 입니다. 컴퓨터 사양을 고려하여 목적에 따라 설치하시기바랍니다. (선택)"
 LangString DESC_SecTitanXPStatus ${LANG_KOREAN} "Titan Panel을 경험치바 형식으로 보이게하고 경험치 정보를 표시합니다. (필수)"
 LangString DESC_SecTitanAggro ${LANG_KOREAN} "어그로 대상을 탐지하고 알려주는 기능을 제공합니다. (선택)"
  ;이하 생략합니다.

  ;.

  ;.

  ;.


 

  ;Assign language strings to sections  ; ◀ 지정한 설명(툴팁) 문자열을 나타내도록 합니다.
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${GR_COMMON} $(DESC_GR_COMMON)
  !insertmacro MUI_DESCRIPTION_TEXT ${GR_T_PLUGIN} $(DESC_GR_T_PLUGIN)
  !insertmacro MUI_DESCRIPTION_TEXT ${SecTitan} $(DESC_SecTitan)
  !insertmacro MUI_DESCRIPTION_TEXT ${SecTitanXPStatus} $(DESC_SecTitanXPStatus)
  ;이하 생략합니다.

  ;.

  ;.

  ;.

 

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

Section "Uninstall"

  ; Remove registry keys  ; ◀ 레지스트리에서 정보를 삭제합니다.
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NukeUI"
  DeleteRegKey HKLM SOFTWARE\NukeUI

  ; Remove files and uninstaller
  Delete $INSTDIR\Uninstall_NukeUI.exe ; ◀ 언인스톨용 exe 삭제

  ; Remove shortcuts
  Delete "$SMPROGRAMS\Nuke UI Ver 0.7 베타\*.*"

  ; Remove directories used for shortcuts
  RMDir "$SMPROGRAMS\Nuke UI Ver 0.7 베타" ; ◀ 시작 프로그램에 등록된 것들 삭제

 ; Remove WOW Inferace And WTF Folder
  RMDir /r "$INSTDIR\Interface" ; Interface(AddOns) 폴더 삭제 ; ◀ /r 옵션으로 모두 삭제
 RMDir /r "$INSTDIR\WTF" ; WTF(Account) 폴더 삭제 ; ◀ /r 옵션으로 모두 삭제

SectionEnd

 

=========================================================================================

 

 

※ 중요하다고 생각되는 부분만 설명 추가로 주석을 달았습니다.

    위 내용만으로 충분히 샘플 스크립트 역할을 하리라고 보는데요 ^^;

 

    NSIS 설치 후, 제공하는 NSIS Examples Directory 폴더의 내용들과

    http://nsis.sourceforge.net/ 의 자료들을 통해서 많은 부분 알 수 있었습니다.

 

    http://jgh0721.egloos.com/ 헬마님의 자료도 많은 도움이 되었습니다.

    이 자리를 빌어 감사드립니다. ^^;

 

    HELP, CHM과 위의 내용들로 기본 부분은 충분히 이해할 수 있으리라 생각합니다.

 

※ 이상 미흡하지만, WOW 애드온 배포본 제작할 때 NSIS로 스크립트를 작성하면서

    기초적인 NSIS 스크립트에 대한 이해를 돕기위해 작성한 글이었습니다.

 


출처 : [직접 서술] 블로그 집필 - Eocs (데들리엔젤::헌터)

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요