헬마입니다.

  며칠전에 방명록에 사용자 페이지에서 조건등을 검사하여 특정 조건이 아니면 다음 페이지로 넘어가지 않도록 하는 작업에 대해서 문의가 있었는데요. 답글을 달고 한동안 해야지 해야지 하다가 이제서야 올리게 되었습니다. ㅠㅠ

간단한 예제 스크립트입니다. 컴파일 후에 실행하시면, 사용자 페이지가 나타나고 입력상자 2개에 같은 비밀번호를 숫자 4자로 입력하지 않으면 다음 버튼을 눌러도 넘어가지 않도록 되어있습니다.




!define APPNAME 'NSIS Example' 
Name 'NSIS 예제 스크립트'

OutFile 'NSIS-Example.exe'

!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"
!include 'WordFunc.nsh'


!insertmacro MUI_PAGE_WELCOME
Page custom ConfigPage CheckConfig '' 
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE 'Korean'

BrandingText 'NSIS 예제 스크립트'

!insertmacro StrFilter

Var hPassword_Text_1
Var hPassword_Confirm

Function ConfigPage
  !insertmacro MUI_HEADER_TEXT '${APPNAME} 설치' '환경 설정'
  
  nsDialogs::Create 1018
  Pop $0
  
  ${If} $0 == error
  	Abort
  ${EndIf}

	${NSD_CreateGroupBox} 50% 0 50% 80% "비밀번호 설정"
	Pop $1

		${NSD_CreateLabel} 61% 20u 30% 10% '개인 비밀번호를 입력하세요'
		Pop $2
  
  		${NSD_CreatePassword} 65% 40u 20% 10% ''
		Pop $hPassword_Text_1

		${NSD_CreateLabel} 60% 70u 33% 10% '한번 더 비밀번호를 입력하세요'
		Pop $3
		
		${NSD_CreatePassword} 65% 85u 20% 10% ''
		Pop $hPassword_Confirm

		${NSD_SetTextLimit} $hPassword_Text_1 4
		${NSD_SetTextLimit} $hPassword_Confirm 4
		${NSD_OnChange} $hPassword_Text_1 nsPageUse_EditNotify
		${NSD_OnChange} $hPassword_Confirm nsPageUse_EditNotify

	nsDialogs::Show
	
FunctionEnd

Function CheckConfig
	${NSD_GetText} $hPassword_Text_1 $0
	${NSD_GetText} $hPassword_COnfirm $1
	
	${If} $0 == ''
		${OrIf} $1 == ''
			MessageBox MB_OK '빈 비밀번호는 허용되지 않습니다.'
			Abort
	${EndIf}
	
	${If} $0 != $1
		MessageBox MB_OK '입력한 비밀번호가 서로 다릅니다\r\n비밀번호는 숫자 4자리로 정해주세요' 
		Abort
	${EndIf}
	
FunctionEnd

Function nsPageUse_EditNotify
	# 통지를 보낸 컨트롤을 스택에서 꺼냄
	Pop $R0 
	
	${NSD_GetText} $R0 $0

	# 문자열을 숫자 문자열로 변환해본 후 길이가 일치하는지 확인
	StrLen $1 $0 	
	${StrFilter} $0 '1' '' '' $2
	Strlen $3 $2
	${If} $1 <> $3
		MessageBox MB_OK '비밀번호는 숫자 4자리만 가능합니다.'
		
		IntOp $1 $1 - 1
		StrCpy $4 $0 $1
		${NSD_SetText} $R0 $4
	${EndIf}
	
FunctionEnd

Section -
SectionEnd

댓글을 달아 주세요

  1. 박정근 2010.03.09 10:47 신고 Address Modify/Delete Reply

    Error: resolving install function "Nsis2Io" in function "mui.WelcomePre_12.5.9"

    에러가 나는데 혹시 원인이 뭔지 알수 있을까요^^;?

    • 헬마 2010.03.09 13:13 신고 Address Modify/Delete

      제가 컴파일한 NSIS 는 2.46 버전입니다. 2.46 을 덮어서 설치해보시고 그래도 안되면 제가 쓰고있는 NSIS 를 압축해서 올려보겠습니다.

  2. BlogIcon 주전자 2010.03.12 09:34 신고 Address Modify/Delete Reply

    아아 nsDialogs를 쓰셨군요!
    감사합니다 +ㅅ+b

  3. 임현석 2010.04.10 14:30 신고 Address Modify/Delete Reply

    NSIS 플러그 인에는 무었이있고 어떡해 사용하는지 좀 알려주세요~~

    프로세스 종료 플러그 인이라던지...

  4. 질문이요 2011.01.11 10:00 신고 Address Modify/Delete Reply

    자신이 입력하기로 원하는 비밀번호는 어디에 설정해야해요?

  5. 2012.02.13 14:01 Address Modify/Delete Reply

    비밀댓글입니다

  6. 2013.09.14 18:28 Address Modify/Delete Reply

    비밀댓글입니다


헬마입니다.

댓글로 요청하신 분이 계셔서 최대한 간단하게 골격 코드 비슷한 분위기로 작성하여보았습니다.

ExperienceUI for NSIS 의 버전은 1.11pre 이상이면 컴파일에 문제가 없을겁니다.

nsi 파일과 같은 폴더에 eula.rtf 라는 라이센스 파일이 있어야합니다. 같은 이름으로 아무 파일이나 넣어주세요 ^^


; XPUI 를 사용하기위한 헤더파일 
!include XPUI.nsh

Name 'test for ExperienceUI'
OutFile testXPUI.exe
InstallDir $PROGRAMFILES\TestXPUI

; 사용할 설치관리자 페이지 추가
${Page} Welcome2
${LicensePage} eula.rtf
${Page} Directory
${Page} Components
${Page} InstConfirm
${Page} InstFiles
${Page} Finish

; 사용할 설치제거관리자 페이지 추가
${UnPage} Welcome2
${UnPage} InstConfirm
${UnPage} InstFiles
${UnPage} Finish

; 언어파일 추가
!insertmacro XPUI_LANGUAGE "Korean"

Section -preSetup
SectionEnd

Section test SecTest
SectionEnd

Section -postSetup
    WriteUninstaller $INSTDIR\uninstall.exe 
SectionEnd

; 섹션에 대한 설명글 추가
!insertmacro XPUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro XPUI_DESCRIPTION_TEXT ${SecTest} '섹션설명'
!insertmacro XPUI_FUNCTION_DESCRIPTION_END



댓글을 달아 주세요

  1. BlogIcon grandterran 2009.12.13 15:26 신고 Address Modify/Delete Reply

    현재 ExperienceUI for NSIS 가 1.3.1 Final 버전이 최신이더군요...

    그런데 UI 테마만 인스톨쉴드처럼 만드는 방법이 아주 쉬운게 있더군요

    HM Nis Edit 2.0.3 으로 스크립트 마법사를 실행해 스크립트를 만든 다음

    아래와 같이

    ; MUI 1.67 compatible ------
    !include "XPUI.nsh"

    이부분의 !include "MUI.nsh"를 XPUI로 고쳐서

    ; MUI 1.67 compatible ------
    !include "XPUI.nsh"

    이렇게 편집해서 컴파일하면 아주 쉽게 UI가 적용 되더군요. ㅎㅎ


    ExperienceUI for NSIS 1.3.1를 설치 했는 가정하에 적용 됨.

  2. 물음표... 2011.08.25 20:43 신고 Address Modify/Delete Reply

    님아.. 참 염치없는 일이겠지만.. 7z 파일을 받아서

    압축을 푸는 예제좀 만들어서 주시면 않될까요? ㅠㅠ;; 아무리 찾아도 다운로드 받고나서

    압축푸는 강좌가 없었음... 너무 염치없는일이지만.. 좀 부탁드립니다.


헬마입니다.

정말 몇 개월만의 업데이트인지 모르겠네요.

몇개 개월만의 업뎃인데도 간단한 버그수정판입니다.

그동안 searchparse 명령의 버그때문에 개발버전으로 받아서 써야했는데 그 문제를 해결한 것이 제일 좋은점이네요.

또한, ExperienceUI for NSIS 가 1.11pre 에서 1.3.1로 업데이트 했습니다.

업데이트 중단인지 알았는데 찾아보니 몇개월전(!) 에 한번 업데이트를 했더군요.. 저것도 2년반만의 업데이트랍니다. ㄷㄷ

p.s : XPUI 1.3.1 설치에 관하여 약간의 잘못된 점이 있어서 수정하였습니다.

댓글을 달아 주세요

  1. deneb 2009.12.07 14:54 신고 Address Modify/Delete Reply

    감사합니다.

    그런데 실행이 안되는데
    저만 그런 것인지
    모두 그런 것인지 모르겠습니다.

    PE에서 보니 CPU와 I/O가 상당히 발생하고 있는데 설치창이 뜨질 않습니다.

    • deneb 2009.12.07 15:16 신고 Address Modify/Delete

      설치 로그 파일만 계속 만드는 것으로 봐서는
      이전 설치와에서 문제가 있는 것 같아
      이전 버전 삭제하고 새로운 버전으로 설치하니 제대로 되네요.
      몇몇 플러그인 때문에 그냥 덮어 씌웠는데 그것이 문제 였군요.

  2. deneb 2009.12.09 10:59 신고 Address Modify/Delete Reply

    이번에 {$NSIS}\Contrib\Language files 에 nsh 파일들이 모두 빠져있는데 일부러 빼신 것인지 아니면 실수하신 것인지 모르겠네요.
    처음에 당황했어요;;;

    • BlogIcon 헬마 2009.12.10 00:13 신고 Address Modify/Delete

      Nsh 파일은 빠지지 않았습니다. 뭔가 선택을 잘못하신것 같네요.

    • deneb 2009.12.10 17:01 신고 Address Modify/Delete

      설치한 nsis-H.M_Edition-setup_2009-12-07 삭제하고
      nsis-H.M_Edition-setup_2009-12-10를 설치하니 같은 현상입니다.
      당연히 기본 설치로 했습니다.
      이번에도 이전 버전이 설치되어 있는 상태에서 설치하게 되면 NSIS에 설치 log만 증가하는 현상이 있어서 모두 삭제해야 설치가 되더군요.

      아시다시피
      MUI 사용하는데 있어서
      !insertmacro MUI_LANGUAGE "Korean"를 넣게 되면
      를 설정하게 되면 {$NSIS}\Contrib\Language files\Korean.nsh에서 설정된 문자열을 가져오기 때문에 필요한데 헬마님의 배포본을 설치하게 되면 당 디렉토리에 nlf 파일만 설치 됩니다.

      저만 해도 이전버전을 백업을 하고 사용하는 편이라 붙혀 넣을 수 있었지만 없으신 분들은 이전 소스들이 컴파일이 되지 않을 듯 합니다.

      확인하셔야 할 것 같습니다.

  3. BlogIcon grandterran 2009.12.20 16:25 신고 Address Modify/Delete Reply

    안녕하세요... NSIS를 사용하면서 궁금하였던 질문을 올립니다. 질문이 너무 많아서 죄송하지만 자세히 설명해 주시면 감사하겠습니다. (아예 새글을 쓰셔서 올리는 것도.... 괜찮은 듯) - 질문이 많아서 다시 한 번 죄송합니다.

    1. ExperienceUI 1.1을 헬마님이 한국어로 변역하여 배포하셨죠? 그 인스톨러로 설치하여 ExperienceUI 1.1_Korea가 설치된 상태에서 그 인스톨러를 다시 실행하면 옵션이 나오죠.. 재설치를 할것인지 제거를 할것인지 체크박스가 나옵니다. 저도 그 부분의 스크립트를 사용하고 싶은데 어떻게 하면 되나요?

    2. 백신 같은 프로그램을 설치할 때 인스톨러가 그 제품의 이전버전이 시스템에 설치 되어 있나 검사하잖아요……. 그 설정은 어떻게 하나요?

    3. 제가 예를 들어 HKEY_LOCAL_MACHINE\SOFTWARE\Example 디렉터리를 만들어서 문자열값(REG_SZ) "Example"을 만들어서 값데이터를 "Example"이라고 만들라고 하려면 스크립트에 어떻게 적으면 되나요?

    4. ExperienceUI 1.1_Korea 인스톨러를 실행하면 몇초동안 ExperienceUI 1.1 로고가 뜹니다. 그건 어떻게 할 수 있나요?

    5. 인스톨러가 설치를 하면서 시스템 해상도를 변경할려면 어떡해 해야죠?

    6. 인스톨러의 설치 구성요소 선택 페이지에 설치프로그램 목록에 강제로 체크가 되어있게 하려면 어떡해 해야 하나요? 또, 설치구성요소 왼쪽에 +표시가 되어있어 여러 목록을 한번에 설치할수 있게, 또 부분적으로 설치할수 있게 만드는 건 어떡해 하나요?

    7. 인스톨러가 실행되면서 백그라운드에 배경이 깔리게하려면 어떡해 하나요?

    8. “알집”의 인스톨러 처럼 설치가 시작하면 광고 배너가 나오게 하려면 어떡해 하나요?

  4. BlogIcon [Creeper] 2012.01.17 20:45 신고 Address Modify/Delete Reply

    져근데요 컴스텀페이지를띄운다음 클릭해서 그건만선택을 해서 설치하는건 어뜨케해요?

헬마입니다.

최근에 댓글로 이제 NSIS Form Editor 나 Venis IX 등이 NSIS 리팩에 더 이상 포함되지 않는 것인지 질문이 올라왔더군요. 사실 가장 정확한 이유는 이것입니다. 제가 그것들이 이제 필요하지 않다고 생각하기 때문이었지요. 그리고 필요하지 않은 이유는 더 좋은 편집기인 Eclipse 에 NSIS 용 플러그인을 얹어서 사용할 수 있기 때문이었습니다.

아직 EclipseNSIS 를 많은 분들이 사용하고 계시지 못하는 것 같아 간단한 설치방법을 여기에 적어보겠습니다.

준비물 : 이클립스, JRE, EClipseNSIS

이클립스 내려받기 : http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5.1-200909170800/eclipse-SDK-3.5.1-win32.zip

Java Runtime Environment 5 이상 :
http://java.sun.com/javase/downloads/index.jsp 에서 JRE 내려받기

EclipseNSIS :
http://eclipsensis.sourceforge.net/index.shtml
http://eclipsensis.sf.net/update

  참고 : EclipseNSIS 는 구동 OS를 체크하며 윈도 7 을 지원하지 않습니다. 따라서, 윈도 7을 사용한다면, Eclipse 를 호환성 옵션을 선택하고 비스타 호환성으로 실행해야합니다.

  이클립스용 NSIS의 플러그인은 당연히 이클립스가 필요합니다. ^^. 이클립스를 이미 사용하고 계시다면 그것을 그대로 사용하시면 되며, 처음 사용하시면 위의 링크에서 이클립스를 내려받으세요. 또한, 이클립스는 자바 프로그램이기때문에 JRE 라는 자바 가상머신을 설치해야합니다. 이미 설치된 버전이 없다면 두번째 링크에서 JRE를 내려받으세요.

이클립스 설치 :  
  이클립스는 별다른 설치과정이 없습니다. 단순히 설치하려는 폴더에 압축을 해제하면 됩니다.

이클립스 실행 : 
  이클립스를 실행하면 최초에 작업공간(workspace) 폴더를 선택하라고 나옵니다. 이클립스는 작업공간이라는 개념을 이해하는 것이 사용하는데 있어서 매우 중요합니다. 이클립스에게 있어서 작업공간이란 이클립스의 모든 설정이 저장되는 공간이며, 모든 프로젝트가 시작되는 공간입니다. 즉, 모든 프로젝트는 작업공간의 하위폴더로 시작된다고 할 수 있습니다.

이클립스 시작 : 
        

  이클립스를 시작하면 위와 같은 화면이 처음에 나타나며 작업할 작업공간을 선택하라고 합니다. 예제로 저같은 경우는 C:\Workspace 라는 폴더를 만들고 이곳을 지정하였습니다. 
  

  이클립스 구동이 끝나면 위와 같은 화면이 최초로 나타납니다. 아직 어떠한 작업도 시작한 적이 없기때문에 이와 같은 초기화면이 나타납니다. 이제 이클립스에 NSIS 플러그인을 설치해야겠지요. 
  이클립스의 플러그인을 설치하는 방법은 크게 2가지가 있습니다. 각 플러그인 웹사이트에서 직접 파일을 받아 압축을 풀어서 넣는 방법과 이클립스의 Update Manager 라는 기능을 이용해 간접적으로 설치하는 방법입니다. 이클립스는 Update Manager 를 통해 설치하길 권장하기 떄문에 이 방법으로 설치해보겠습니다.

EclipseNSIS 설치 : 
  이클립스를 실행한 후 Help->Install New Software 를 선택합니다.
          
   이제 여기서 사이트등을 검색해서 설치하는 것입니다. 먼저 Add 버튼을 눌러 아래와 같이 입력합니다.
          
  입력 후 잠시 기다리면 아래의 이미지와 같이 설치가능한 EclipseNSIS 항목들이 나타납니다. 설치할 항목을 선택하고 Next 버튼을 누릅니다. 주로 Source 를 제외하고 모두 설치하는 것이 좋습니다.
          
   Next 버튼을 누르면 이 소프트웨어를 설치하기 위해 다른 필요한 항목들이 있는지 자동으로 검색 후 실제로 설치할 항목을 아래 이미지와 같이 알려주고 마지막으로 확인합니다.
       
  설치할 항목을 확인하면 이제 라이센스 동의문이 나타나고 동의합니다. 동의는 보통 한번만 하면 됩니다. ^^. 동의를 하고 Finish 를 눌러 최종적으로 설치를 시작합니다.
          
  Finish 버튼을 누르면 설치과정이 백그라운드 작업으로 진행되며 설치가 끝나면 이클립스를 재시작하겠느냐고 묻는 질문이 나타납니다. 재시작하면 설치한 플러그인이 작동합니다.

EclipseNSIS 설정 :
          
  EClipseNSIS 는 기본적으로 레지스트리에서 NSIS 의 설치경로를 검색합니다. 하지만, 컴퓨터를 재설치하고 NSIS는 재설치하지 않고 그대로 쓰는 경우라거나 하면 NSIS의 설치경로 레지스트리가 없기때문에 수동으로 위치를 지정해야합니다. NSIS Home : 이라는 곳에 Makensis.exe 의 경로가 나타나있지 않으면 ... 버튼을 눌러 MakeNsis.exe 가 있는 폴더를 지정합니다. 이제 기본적으로 EclipseNSIS 를 사용할 준비가 끝났습니다.

댓글을 달아 주세요

  1. kimera 2009.12.13 23:12 신고 Address Modify/Delete Reply

    ㄴ님 안될거같습니다... 제가 레지로 연결 해봤는대도.. 인식을못합니다.

  2. BlogIcon wswse 2012.08.29 14:35 신고 Address Modify/Delete Reply

    이클립스는 자바 개발툴이며 JRE(일반유저용)로 하는것이아닌 JDK(개발자용)으로 하여야합니다.


헬마입니다.

며칠전에 방명록에서 관련 질문을 받고 써야지 하다가 게으름에 이제서야 글을 쓰게 되었습니다.

사실 코드는 굉장히 단순하구요.

사용자 정의 대화상자를 만들어서 체크박스 등을 통해 선택받는 방법은 2가지가 있습니다.

NSIS 2 초기에 사용되었던 INI 파일을 이용한 InstallOptions 라는 플러그인을 이용하는 방법이 첫째입니다.

둘째는, 비교적 최근 버전의 NSIS에 도입된 nsDialogs 플러그인을 이용하는 방법입니다.

후자의 방법이 속도도 훨씬 빠르며, 유연합니다. 또한, 더욱 여러가지 원하는 대로 통제도 가능하지요. 하지만, 그런만큼 윈도 프로그래밍의 지식을 갖추지 않으면 어렵습니다.

이번에 예제는 후자인 nsDialogs 플러그인을 사용하도록 작성했습니다.

작성 NSIS 버전은 2.45 버전입니다.

예제 테스트 방법은 NSIS 폴더에 넣고 컴파일 후 실행하여 보시면 됩니다.


컴파일 후에 실행하면 위와 같은 화면이 나오며, 선택하면 선택한 단축아이콘이 바탕화면에 생성됩니다.



!include LogicLib.nsh
!include nsDialogs.nsh

Name 'NSIS_EX'
OutFile 'Nsis_ex.exe'
XPStyle on

Page custom nsDialogEnter nsDialogLeave
Page instfiles

Var hMainDlg
Var hCheckBox1
Var hCheckBox2
Var CheckState

Section -
SectionEnd

Function nsDialogEnter
	nsDialogs::Create 1018
	Pop $hMainDlg
	
	${If} $hMainDlg == error
		Abort
	${EndIf}
	
	${NSD_CreateCheckBox} 0 0 100% 12u 'MakeNSISW.EXE 단축아이콘 생성'
	Pop $hCheckBox1
	
	${NSD_CreateCheckBox} 0 14u 100% 12u 'NSIS.EXE 단축아이콘 생성'
	Pop $hCheckBox2
	
	${NSD_SetState} $hCheckBox1 ${BST_CHECKED}
	nsDialogs::Show
	
FunctionEnd

Function nsDialogLeave
	${NSD_GetState} $hCheckBox1 $CheckState
	${If} $CheckState == ${BST_CHECKED}
		MessageBox MB_OK 'MakeNSISW 단축아이콘을 생성합니다.'
		CreateShortCut '$DESKTOP\MakeNSISW.LNK' '$EXEDIR\MakeNsisw.exe'
	${EndIf}
	
	${NSD_GetState} $hCheckBox2 $CheckState
	${If} $CheckState == ${BST_CHECKED}
		MessageBox MB_OK 'Nsis 단축아이콘 생성'
		CreateShortCut '$DESKTOP\nsis.exe' '$EXEDIR\nsis.exe'
	${EndIf}	
FunctionEnd

댓글을 달아 주세요

  1. BlogIcon enemy 2011.05.11 16:15 신고 Address Modify/Delete Reply

    하나 알고 갑니다.^^
    감사 드립니다.

  2. BlogIcon 지우 초이 2016.03.24 12:13 신고 Address Modify/Delete Reply

    nsdialog설명중에서 가장 간단하면서도 가장 명쾌합니다.
    왜쓰는지, 어떻게쓰는지 완벽히 이해하고갑니다!


헬마입니다.  

 오늘 우편함을 확인해보니 NSIS 에 관한 질문 우편이 왔더군요.

 제목이 단지 "헬마님" 이길래 처음에는 흔한 스팸인줄 알았습니다.

 최근들어 이상하게 스팸이 자주와서 곤란을 겪고 있거든요..

 그래서 내용을 보기도 전에 삭제키를 누르려다가 그래도 스팸 내용이나 한번 봐보자 하다가 스팸이 아니라는것을 알았습니다. ^^

 질문 내용을 보니 처음에 NSIS 를 익히시는 많은 분들의 고민이 그대로 있는거 같아서 이렇게 게시물로 올려보게되었습니다.

 -----

 NSIS 는 설치관리자입니다. 설치관리자의 가장 주된 역할은 간단히 말하면 파일을 가지고 있다가 다른 컴퓨터에 파일을 설치하는 것 이라고 할 수 있죠.

 그런데, NSIS 명령들을 쭉 살펴봐도 겉보기에는 파일을 가져오는 명령은 있는데 설치하는 명령은 보이질 않습니다.

 난감하지요. ^^ 그거 옆구리만 긁적 긁적 긁게되는데요.

 핵심은 딱 2개의 명령어로 이루어져 있습니다.

 하나는 SetOutPath 와 또 하나는 File 명령어 입니다.
 
 먼저는 SetOutPath 는 가지고 있는 파일들이 설치될 장소를 지정합니다.
 설치할 장소가 변경될 때마다 새로 지정해야하는 것은 당연하겠죠? ^^

 이제 제일 중요한 File 명령입니다.
 겉보기에는 이는 단지 설치관리자 제작 컴퓨터에서 파일을 가져오기만 하는 명령어로 보입니다.
 하지만, 이 명령어는 2가지 역할을 합니다.
 첫째, 컴파일시에는 설치관리자로 파일을 가져오는 역할 입니다.
 둘째, 스크립트가 실행될 때는 지정된 파일을 SetOutPath 에 지정된 폴더로 설치하는 역할입니다.

 이렇게 2가지 명령어를 이용하여 파일을 설치하는 작업을 할 수 있습니다.

[my folder]
\->Release
\--->Windows
\------>aaa.dll
\--->Program
\------>main.exe
\->Source

 우편으로 질문이 왔던 위와 같은 상황이라면, 아래와 같이 코드를 작성하시면 됩니다.


	Name 'NSIS_EX_TEST'
	OutFile 'NSIS_EX_TEST.EXE'
	InstallDir '$PROGRAMFILES\MyProgram'

	Section 'Ex_Test'
		SetOutPath $WINDIR
		File 'C:\\my Folder\\Release\\Windows\\aaa.dll'
		
		SetOutPath $INSTDIR
		File 'C:\\my Folder\\Release\\Program\\main.exe'
	SectionEnd

댓글을 달아 주세요

헬마입니다.

매우 매우 오랜만에 NSIS 관련한 글을 포스팅하게 되었네요.

NSIS 의 SearchParse 와 SearchReplace

NSIS 에 새로 컴파일 타임 명령어로 SearchParse 와 SearchReplace 라는 명령이 추가되었습니다.

사실 추가된지는 꽤 되었습니다. 하지만, 의외로 쓰시는 분이 별로 없는듯하여 이번에 간단한 글을 작성해보려 합니다.

이 명령들은 사실 일반적으로는 별로 쓰일일이 드문편입니다. 주로 이 명령들이 쓰이는 곳은 다른 언어의 설정파일과 설정내용을 동기화할 때 쓰이지요.

예를 들어, C++ 로 윈도 응용 프로그램을 작성하면 보통 제품의 버전번호는 소스코드의 rc 확장자를 가진 리소스 파일에 저장되고 관리됩니다.

하지만, NSIS로 설치관리자를 만들때 VIAddVersionKey 라던가 VIProductVersion 이라는 속성을 사용해서 설치관리자에도 버전을 설정할 수 있지만, 이 둘을 언제나 일치시키는 것은 역시나 귀찮은 일이지요.

이럴때 위의 두가지 컴파일 타임 명령어를 사용하면 자동으로 동기화를 시킬 수 있어요. ^^

간단한 예제를 통해서 그 방법을 적어보겠습니다. ^^

사실, 저도 한동안 NSIS 작성할 일이 없어서 손을 안대고 있다가 최근에 회사 프로젝트의 설치관리자를 수정하다가 적용해보고 적는 것 입니다 ^^

준비물 :
NSIS - 사용하는 버전이 2.45 버전이라면 http://nsis.sf.net 에서 일일빌드를 받아서 설치하세요. 공식배포 2.45버전에는 !searchparse 명령에 버그가 있습니다
동기화할 파일

먼저, 도움말을 살펴보죠.

	!searchparse

		[/ignorecase] [/noerrors] [/file] source_string_or_file substring_start OUTPUTSYMBOL1 [substring [OUTPUTSYMBOL2 [substring ...]]]
source_string_or_file 을( /file 을 설정하면 파일이름으로, 설정하지 않으면 문자열로 취급 ) 분석하여 substring_start 을 검색합니다.
substring_start 가 검색되면 OUTPUTSYMBOL1 이 문자열의 나머지 부분( substring 을 설정했고 이 문자열이 검색되면 이 문자열은 제외됨 ) 이 선언됩니다. 몇 개의 OUTPUTSYMBOLx 라도 설정될 수 있으며 마지막의 substring 은 선택적입니다.
/noerrors 가 설정되면, 모든 문자열이 일치하지 않아도 되며 ( 모든 OUTPUTSYMBOLx ) 후에 검색되지 않은 하위문자열은 무시됩니다.
/file 가 설정되면, 파일은 줄의 모음으로 취급됩니다. 파일은 모든 하위문자열이 일치할 때 까지 검색됩니다. /noerrors 가 설정되고 모든 문자열이 일치하지 않았다면 가장 많은 기호가 일치한 첫 행이 사용됩니다.
	!searchreplace

		[/ignorecase] symbol_out source_string searchfor replacewith 
source_string 을 검색하여 이 문자열에서 searchfor 를 모두 replacewith 로 치환합니다. !define 과는 다르게 !searchreplace 는 여러분이 경고 또는 오류없이 symbol_out 을 재정의할 수 있도록합니다.
음, 솔직히 제가봐도 알쏭달쏭합니다. 어떻게 쓰라는 건지 영 감이 안오죠.

예제로 사용할 파일 소스
- 첨부파일로 들어있는 rc 파일을 사용하시면 됩니다.

이제 첫 단계로, 어느 부분을 동기화 시킬지 결정해야죠. 저는 rc 파일에서 제품 버전정보를 가져와서 이를 언제나 설치관리자의 버전 정보로 사용하고 싶어요.
그래서 rc 파일을 살펴보니 PRODUCTVERSION 1,0,0,1 이라는 부분이 보입니다. 이 부분을 가져다가 요리저리 가공하면 어찌될 것 같네요.

아래는 예제 코드에요.
간단한 주석을 실었습니다.

Name 'NSIS_EX'
OutFile 'NSIS_EX.EXE'

!include MUI.nsh
!insertmacro MUI_LANGUAGE "Korean"

; Calc_test.rc 파일에서 PRODUCTVERSION 이라는 문자열을 찾은 후 그 줄의 그 다음 부분을 VERSION_NAME 이라는 이름으로 선언. ( 변수가 아니라 !define 으로 선언한 것과 같은 효과 입니다 )
!searchparse /ignorecase /file '.\Calc_Test.rc' 'PRODUCTVERSION' 'VERSION_NAME' ''
; rc 파일을 보시면 버전 번호를 지정할 때는 쉼표를 사용하게 되어있습니다. 하지만, VIAddProductVersion 을 사용할때는 마침표로 변경해야합니다. 
; 하지만, !define 으로 선언한 것은 일반적인 방법으로는 쉽게 변경할 수 없습니다. 이를 해결하기위해 !searchreplace 가 추가되었습니다. 
; VERSION_NAME 이라는 기호에서 "," 를 찾아 "." 으로 변경합니다. 처음에 기호 이름을 지정할 때 ${} 로 둘러싸지 않은 점을 눈여겨보세요.
!searchreplace /ignorecase VERSION_NAME ${VERSION_NAME} "," "."

VIAddVersionKey /LANG=${LANG_KOREAN} 'ProductVersion' '${VERSION_NAME}'
VIAddVersionKey /LANG=${LANG_KOREAN} "ProductName" "NSIS_EX"
VIAddVersionKey /LANG=${LANG_KOREAN} "Comments" "NSIS_EX Setup"
VIAddVersionKey /LANG=${LANG_KOREAN} "CompanyName" "초짜 플머 헬마"
VIAddVersionKey /LANG=${LANG_KOREAN} "LegalTrademarks" ""
VIAddVersionKey /LANG=${LANG_KOREAN} "LegalCopyright" ""
VIAddVersionKey /LANG=${LANG_KOREAN} "FileDescription" "NSIS_EX"
VIAddVersionKey /LANG=${LANG_KOREAN} "FileVersion" "${VERSION_NAME}"
VIProductVersion '${VERSION_NAME}'

Function .onInit
	SetSilent silent
	
	MessageBox MB_OK ${VERSION_NAME}
FunctionEnd

Section -
SectionEnd

댓글을 달아 주세요

헬마입니다.

이번에 회사에서 인스톨러 제작하면서 더욱 더 많은 것을 시도해보게 되는 것 같네요.

제작하는 인스톨러가 환영페이지 앞에 특정조건에 따라 비밀번호를 묻는 사용자페이지가 삽입되어 있었는데 이 페이지로 인해 환영페이지에서 무조건 뒤로 버튼이 출력되는 문제가 있었습니다.

NSIS 포럼에 가보니 역시 문제 해결책이 있더군요.

예제 코드는 환영 페이지 에서 뒤로 버튼을 감춥니다.

!define MUI_PAGE_CUSTOMFUNCTION_PRE Welcome_Pre
!insertmacro MUI_PAGE_WELCOME

<--- 위와 같이 조작하려는 페이지 앞에 사용자 함수를 호출하도록 선언합니다.

Function Welcome_Pre
  GetDlgItem $R0 $HWNDPARENT 3
  ShowWindow $R0 ${SW_HIDE}
FunctionEnd

<--- 위와 같이 함수를 작성하면 뒤로 버튼이 나타나지 않습니다.

PS. 뒤로 버튼 3
      다음 버튼 1
      취소 버튼 2 입니다.

댓글을 달아 주세요

  1. 우군 2007.11.05 17:11 신고 Address Modify/Delete Reply

    죄송한 말씀입니다만, 토커는 어찌되가시는지요..

  2. 이군 2007.11.15 21:45 신고 Address Modify/Delete Reply

    저도 토커를... ㅡㅡ;;
    꾸벅~

헬마입니다.

정말 오랜만에 관련 글을 올리게되었네요..

이번에 회사에서 인스톨러 하나 만들다가 인터넷 연결 상태를 확인해야할 일이 생겨서

찾아보다가 올립니다.

 System::Call 'wininet.dll::InternetGetConnectedState(*i .r0, i 0) i.r1'
 MessageBox MB_OK "$1 $0 Modem=1, LAN=2, Proxy=4, RAS=0x10, Offline=0x20 Configured=0x40"


함수는 이렇게 되어있으며,

호출하면 $1 에는 성공여부 1이면 성공, 0 이면 실패가 되며
$0 에는 연결 상태 값이 들어옵니다.

확인방법은

IntOp $2 $0 & 0x20
이렇게 연산해서 $2에 0x20 값이 들어있으면 오프라인상태이고 아니면 연결상태라고 보시면 됩니다.

댓글을 달아 주세요

헬마입니다.

저번에 올린 글 대로 스크립트 원본입니다..

베타테스트했던 빌드 42 알파 2 그대로이고..

그후로 버그 수정 하나도 못했네요. ㅠㅠ

스크립트에서 궁금하신 점 있으시면 메일 보내주시면 답변드리겠습니다.

Setup Factory 가 7.0에 와서 많이 좋아진 적 같던데

이걸로 전환을 해보려 하는데 시간이 허락할 지 모르겠네요 ㅎㅎ


댓글을 달아 주세요

  1. 2007.05.19 09:17 신고 Address Modify/Delete Reply

    헬마님..멜 주소가 어떻게 되나요??=ㅁ=;;

  2. BlogIcon 헬마 2007.05.19 11:20 신고 Address Modify/Delete Reply

    jgh0721@nate.com 입니다. 네이트온으로 연락하셔도 됩니다