간만의 포스팅(3년만...)


간만의 NSIS...


퀘스트는 제목과 같았다...

설치 중 취소하면 취소 전 설치 된 파일을 모두 삭제해 주세요.

고난의 시작이었다.


파일을 설치하기 전단계에서의 취소는 어차피 하드에 기록한게 없으니 상관 없다.


문제는 파일을 설치하는 도중에 취소를 할 경우...


파일 설치는 별도의 thread 에서 처리되고 있어서, 파일 설치 중 강제로 페이지를 이동시키거나 해도 파일 설치 thread 는 계속 동작한다.


그러니 main thread 에서 파일을 삭제해도 제대로 지워지지 않는다.


파일 설치 thread 를 제어할 방법이 있으려나해서 nsis 소스까지 까봤으나 없다. 왜!!


google 느님에게 물어보면 복잡스런 코드가 있기는 한데 이건 취소하면 변수 하나에 취소 했다고 체크해두고


파일 설치에서 한 아이템을 설치 할 때마다 해당 변수를 체크해서 중단하거나 한다.


요거 -> http://nsis.sourceforge.net/InstFiles_Cancel_-_Allowing_a_user_to_cancel_installation_during_InstFiles


하지만, 문제는 너무 번거롭기도 하거니와 설치 스크립트를 아래처럼 폴더로 지정한 경우는 사용이 불가하다. Orz...


    File /r ..\src\* # 이 경우 하나의 아이템으로 처리되고 있어 중단할 수 없다.


결국, 3 일간의 삽질 끝에 해결한 방법을 대충 정리하면 아래와 같다.

  • 설치 SECTION에서 가장 먼저 uninstall.exe 파일을 설치한다. ( 원래는 -post 에서 설치된다. )
  • !define MUI_CUSTOMFUNCTION_ABORT "onUserAbort" # 취소 처리를 제어할 수 있도록 등록한다.
  • 전역 변수 하나를 설정하여, 파일 설치 전 취소 처리에서 알 수 있도록 값을 지정해둔다.
  • onUserAbort 함수에서 파일 설치 중에 취소 했음이 확인 되면 uninstall.exe 를 silent 모드로 실행한다.
    예) ExecWait '"cmd.exe" /C start "" "$INSTDIR\uninstall.exe" /S'
  • uninstall.exe 호출시 주의할 점은 nsExec::Exec 를 이용하면 안된다. nsExec::Exec 를 이용하면 파일 손상 에러가 난다. (이유는 모름.)
  • un.onInit 에서 silent 모드인 경우 설치 프로세스를 종료하도록 처리 한다.

Function un.onInit

    ${GetParameters} $R0

    ${If} $R0 == "/S"

        nsExec::Exec 'taskkill /F /IM ${OutFile}'

        Sleep 2000

    ${EndIf}


상세 코드는 귀찮으니.... 나중에 생각나면 정리해서 올려야겠다.

반응형
nsis 에서 바로가기를 생성해주는 CreateShortcut 명령어.
근데 사용하다보니 생성된 바로가기의 "시작 위치" 정보가 이상하게 들어가고 있어 메뉴얼을 봤지만 CreateShortcut 에는 해당 정보 설정이 없다. 해서 우짜저짜 하다가 알게 된 방법. 사실 맞는 방법인지는 모르겠지만, 잘 되니까 뭐 -_-

CreateShortcut 명령 사용 전에  SetOutPath 을 통해 "시작 위치" 로 지정할 폴더를 지정해주면 된다.

사용 예)
반응형
User inserted image

이번에 Vista 대응 작업을 하던 중 NSIS에서 설치 페이지를 뒤로 옮겨야 하는 일이 생겼다.
기본 Manual을 아무리 찾아봐도 안나오고 -_ㅠ
한참의 삽질 끝에 결국 google님의 힘을 빌어 찾아냈다.

아무래도 직접적인 페이지 이동 명령어는 존재하지 않고 SendMessage를 이용하여
뒤로 버튼을 누른 윈도우 메세지를 전달하는 듯 하다.

링크 : http://nsis.sourceforge.net/Go_to_a_NSIS_page

추가해줘야 할 Function

Function RelGotoPage
IntCmp $R9 0 0 Move Move
StrCmp $R9 "X" 0 Move
StrCpy $R9 "120"

Move:
SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

사용 법 : $R9 스텍에 페이지 이동 수치를 입력 후 RelGotoPage를 호출

StrCpy $R9 "(number|X)" ;Relative page number. See below.
Call RelGotoPage

내 경우는 InstallPath 를 점검하여 설치 할 수 없는 폴더일 경우 다시 폴더 선택을 하도록 하는 처리가 필요했으며 파일 설치 직전에 $INSTDIR 를 체크하여 설치할 수 없는 폴더일 경우 -1 페이지 이동 처리를 했다. (파일 설치 페이지가 폴더 선택 페이지 바로 다음이었다.)

NSIS 메뉴얼 너무 부실해.. -_ㅠ
반응형

'저장고 > 기타' 카테고리의 다른 글

[MSSQL] CASE 함수  (0) 2008.05.19
자신의 외부 IP를 알고 싶을 때... :)  (2) 2006.12.06
MS-SQL 매일 날짜별로 백업화일 생성하기  (0) 2006.10.17

+ Recent posts