헬마입니다.

전에도 글을 올렸듯이

광고패치 스크립입니다.

필요한 유틸이 몇가지 있습니다.

gsar은 여러번 소스코드와 함께 올렸으니 그걸 받으시면 되구요. 인터넷에도 많습니다.

리소스 해커도 역시나 인터넷에 ㅎㅎ

그리고 마지막으로 직접 만든 정규표현식 유틸은 제 블로그에 있습니다.

댓글을 달아 주세요

  1. 베나자르 2007.05.24 15:00 Address Modify/Delete Reply

    RegularExp.exe 이 정규표현식 유틸인가요?

    블로그에서 찾지를 못하겠습니다. ^^;;

헬마입니다.

여러번 계속 NSIS로 이거저거 만들다보니 느낀 것이..

참으로 처음에 기본 적인 토대랄까 이거 코딩하는 것이 무척이나 귀찮더군요.

그래서 이번에 리팩 몇개 하면서 시간내서 만들어보았습니다.

제 NSIS -H.M- 버전을 기반으로 제작되었고

UI는 XPUI와 MUI를 모두 지원합니다.

압축을 푸시고 Main.nsi 파일에 주석을 참고하셔서 수정하셔서 쓰시면 됩니다.

NSIS -H.M- 2.24 이상 버전을 추천합니다. ^^

댓글을 달아 주세요

헬마입니다.

NSIS를 가끔 쓰다 보면 긴 파일이름과 도스 8.3 형식의 짧은 파일이름을 서로 변경해가면 써야할 일이 생깁니다. 그런데 NSIS는 GetFullPathName /SHORT 을 통해 짧은 이름으로 바꾸는 기능은 있지만 짧은 이름을 다시 긴 이름으로 변경해주지는 않습니다.

그래서 이리저리 NSIS 포럼을 뒤지다가 NSIS에 기본 포함된 System 플러그인을 이용해서 윈도 API를 호출하는 방법으로 서로 변환하는 스크립트가 있더군요.

여기 소개합니다.

!macro ShortToLongPathName LongPath
; 매크로 호출 후 $1 값을 읽으면 변환된 경로명을 읽을 수 있음
StrCpy $1 "" ; $1 에 변환된 긴 경로명이 저장됨.
System::Call "Kernel32::GetLongPathNameA(t '${LongPath}', &t .r1, i ${NSIS_MAX_STRLEN}) i .s"
Pop $0
IntCmp $0 ${NSIS_MAX_STRLEN} +2 +2 0 ; 반환된 길이가 $0 에 저장되며 이 값이 ${NSIS_MAX_STRLEN} 값보다 크면 실패
Abort "failed!"
!macroend

!macro LongToShortPathName ShortPath
; 매크로 호출 후 $1 값을 읽으면 변환된 경로명을 읽을 수 있음
StrCpy $1 "" ; $1 에 변환된 짧은 경로명이 저장됨.
System::Call "Kernel32::GetShortPathNameA(t '${ShortPath}', &t .r1, i ${NSIS_MAX_STRLEN}) i .s"
Pop $0
IntCmp $0 ${NSIS_MAX_STRLEN} +2 +2 0 ; 반환된 길이가 $0 에 저장되며 이 값이 ${NSIS_MAX_STRLEN} 값보다 크면 실패
Abort "failed!"
!macroend

제가 코덱팩에 쓸려고 매크로를 이용하게 약간 수정했습니다.

사용방법은..

LongToShortPathName 'c:program files'

이런식으로 호출하고

$1 에 보면 변환된 경로명이 저장되어 있습니다.

즉,

LongToShortPathName 'c:program files'

MessageBox MB_OK $1

이렇게 하면 C:Program Files 경로을 짧은 이름으로 변경해서 $1에 저장하고

$1에 저장된 내용을 표시하는 메시지 박스를 출력합니다.

그럼 이만..

댓글을 달아 주세요

헬마입니다.

이번엔 InstallOptions 플러그인을 사용해 인스톨러에 사용자 페이지를 추가하는 법을 알아보겠습니다.

준비물 : NSIS, HM NIS Edit

NSIS는 당연히 필요하겠구요, HM NIS Edit는 추가할 사용자 페이지를 쉽게 만들어줍니다. 그렇지 않으면 일일이 ini 파일을 직접 수정해서 좌표값 입력해 가며 만들어야합니다. OTL... 굉장한 노가다 입니다.

제가 만든 NSIS 한글 배포본에 HM Nis Edit 가 포함되어 있으니 이걸 사용하시면 됩니다.

일단 추가할 사용자 페이지를 만들어야하니 HM Nis Edit를 실행합니다.

그리고 파일 메뉴에서 인스톨옵션 파일 만들기를 선택하면 아래와 같은 화면이 나타납니다.



이제 위 화면에서 추가할 페이지의 컨트롤등을 넣어주면 됩니다.


작성하면 이제 ini 파일을 저장하고 스크립트에 페이지를 추가하는 명령을 넣으면 됩니다.

이지를 추가하려면 세가지 과정이 필요합니다.

일단 인스톨러 초기화 콜백함수인 .onInit 함수 에서 ini파일을 임시디렉토리에 풀어줍니다.

두번째로 page 명령으로 페이지를 추가합니다.

세번째로 사용자페이지에서 사용할 함수를 작성합니다.

여기서는 예제로 저의 코덱팩 스크립트를 발췌했습니다.

1) 아래처럼 .onInit 함수에서 ini 파일을 풀어주는 매크로를 추가합니다.

(첫번째 매개변수) ${Codec}ffdshow.ini 파일은 ini파일이 있는 디렉토리이고 (두번째 매개변수) ffdshow.ini 파일은 임시디렉토리에 풀때 사용할 파일명 입니다.

Function .onInit
!insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "${Codec}ffdshow.ini" "ffdshow.ini"
FunctionEnd

2) Page 명령으로 추가합니다.

아래와 같이 Page custom 명령으로 추가할 페이지를 삽입합니다. 페이지는 순서대로 나타납니다.

여기서는 ffdshow 디코더 설정화면이 컴포넌트 선택화면 다음에 나타나게 됩니다.

custom - 사용자 페이지를 추가한다는 뜻

ffdshow - 사용자 페이지를 나타내는 등의 역할을 하는 함수 이름. 다음에 작성합니다.

!insertmacro MUI_PAGE_COMPONENTS
Page custom ffdshow ; ffdshow 디코더 설정 화면
!insertmacro MUI_PAGE_INSTFILES

3) 이제 마지막으로 ffdshow 함수를 작성합니다.

아래와 같은 형식으로 함수를 작성합니다. 함수이름은 물론 page 명령에서 지정한 이름으로 만들어야합니다. 아래 스크립트에서는 ffdshow 디코더 설정화면이기때문에 ffdshow를 설치할 때만 나타나야 합니다. 그래서 앞의 세개의 명령이 섹션 정보를 얻고 ffdshow 섹션이 선택되었을때만 페이지를 보여줍니다.

매크로 - MUI_HEADER_TEXT - 사용자 페이지의 제목입니다. 자세한 설명은 한글화한 도움말을 참조하세요.

매크로 - MUI_INSTALLOPTIONS_DISPLAY - 이 매크로를 넣지 않으면 ffdshow 함수가 호출되어도 페이지는 보여지지 않습니다. 즉, 보여줄려고 메모리상에 페이지만 만들어놓고 끝나게 되어버리지요. 이때 보여줄 페이지는 아까 MUI_INSTALLTOPTIONS_EXTRACT_AS 매크로에서 두번째 매개변수로 지정한 이름을 적습니다.

Function ffdshow
SectionGetFlags ${ffdshow} $2
IntCmp $2 ${SF_SELECTED} start end end
start:
!insertmacro MUI_HEADER_TEXT 'ffdshow decoder' 'ffdshow decoder 를 사용할 확장자를 선택하세요'
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "ffdshow.ini"
end:
FunctionEnd

이렇게 하면 페이지 추가가 끝납니다.

이제 컴파일하면 페이지가 나타납니다.

이후 페이지에서 지정한 값을 받는 법등은 도움말에 나타나있습니다.

예) 위에서 사용한 ffdshow 에서 사용자 선택한 값을 읽어오는 스크립트 입니다.

InstallOptions 는 지정한 값을 읽을때 READ 매크로와 WRITE 매크로를 제공합니다.

문법 -

!insertmacro MUI_INSTALLOPTIONS_READ $VAR "ioFile.ini" "Field #" "Name" !insertmacro MUI_INSTALLOPTIONS_WRITE "ioFile.ini" "Field #" "Name" "Value" 

아래의 스크립트는 ffdshow.ini 에서 Field 1 값의 state 값을 읽어옵니다. state 값에는 Field 1 컨트롤의 여러 상태가 저장됩니다(컨트롤이 선택되었는지 여부등). 이 값을 1(선택됨) 과 비교하여 같으면 레지스트리를 입력하고 다르면 2번째 명령으로 내려가 레지스트리 쓰기를 건너뛰게 합니다.

!insertmacro MUI_INSTALLOPTIONS_READ $R0 "ffdshow.ini" "Field 1" "State" ; XviD
StrCmp $R0 "1"  0 +2
WriteRegDWORD HKCU SoftwareGNUffdshow xvid 0x00000001

이정도면 InstallOptions 를 이용해 페이지를 추가하는데 별 문제가 없을 듯 합니다.

더 궁금한 사항이 있으시면 글 남겨주세요.

ps. 같은 페이지에 계속 머무르기
  이러한 페이지체제는 기본적으로 지정한 함수에 진입해서 MUI_INSTALLOPTIONS_DISPLAY 를 호출하는 순간 화면에 페이지가 나타나고 그 함수안에서 MUI_INSTALLOPTIONS_DISPLAY 다음에 있는 명령들이 끝나면 다음 페이지로 넘어갑니다. 즉 어떤 조건이 되었을때 다시 MUI_INSTALLTOPTIONS_DISPLAY를 호출해주면 됩니다.

예)
${Do}
    MUI_INSTALLOPTIONS_DISPLAY_RETURN
    pop $R0
${While} $R0 != "success"
이런식으로 하면 $R0 의 값이 "success" 가 아닌동안 게속 돕니다

댓글을 달아 주세요

헬마입니다.

NSIS 스크립트는 기본적으로 위에서 아래로 순서대로 실행이 된다지만 약간 헷갈리기도 합니다.
컴파일타임명령과 특히 이곳저곳에 섞이는 인스톨러 속성 명령때문이 아닌가 합니다.

--------------
컴파일 타임 명령 - 컴파일되면서 그때 그때 실행되면서 실행 인스톨러에는 영향을 미치지 않습니다.

예로 (현재 디렉토리 c: est est 이고 압축할 파일은 C: est est.exe  일때)

Section -PrePare
!cd ..
File 'test.exe'
SectionEnd

이렇게 하면 컴파일러가 컴파일하면서 디렉토리를 한번 상위 디렉으로 이동해서 test.exe 를 압축합니다.

Section -PrePare
File '.. est.exe'
SectionEnd

과 같은 결과입니다. 사실상 거의 쓸일이 없습니다만...
컴파일 타임 명령은 주로 !define 명령이 사용됩니다. 컴파일 타임 명령은 인스톨 속성 명령과 달리 실행 순서가 되야 실행됩니다.

인스톨러 속성 명령
인스톨러를 초기화합니다. 컴파일러는 인스톨 속성 명령을 스크립트 전체를 분석해서 한번에 모아서 적용시킵니다. 즉, 섹션등에 포함되거나 하지만 않으면 스크립트 위치에 상관이 없습니다.
즉, 스크립트 맨위에 Name 명령있거나 맨 뒤에 Name 명령이 있거나 전혀 상관없습니다.

콜백 함수

Function .onInit
인스톨러가 실행되어 초기화가 막 끝난 시점. 보통 인스톨러가 시작되기 전 조건 검사 등을 여기서 검사합니다. (특정 프로그램을 종료시킨다거나. 등등..)

Function .onGUIInit
인스톨러 화면을 메모리에 불러들이고 보여주기 직전

섹션 또는 사용자 함수
섹션이 순서대로 진행되며 섹션에서 함수들을 호출합니다.

Function .onInstSuccess
설치가 끝나고 윈도가 닫히기 직전에 호출
대개 위와 같은 순서를 거칩니다. 중간 중간에 이벤트에 따라 아래와 같은 콜백 함수가 호출되기도 합니다.
-----------

Function .onInstFailed
인스톨 과정 중 언제든지 실패하면 호출됨

Function .GUIEnd
설치화면이 닫힌 직후에 호출됩니다. 설치 성공여부등에 전혀 상관 없습니다. 즉, 컴포넌트 페이지에서 컴포넌트 선택하다가 그냥 취소 눌러서 종료시켜도 화면이 사라질때 호출됩니다.

Function .onMouseOverSection
컴포넌트 선택화면에서 마우스 커서가 섹션위에 위치할 때 호출됩니다.

Function .onRebootFailed
인스톨 중에 Reboot 명령으로 재부팅을 시도했지만 실패하면 호출됩니다.

Function .onSelChange
컴포넌트 페이지에서 선택한 섹션이 변경되면 호출됩니다.
... 등등의 콜백함수가 있습니다. (^^)

댓글을 달아 주세요

NSIS - Section을 선택할 때 라디오버튼 기능을 넣자!

라디오 버튼 기능을 하려면 몇 가지 순서가 있습니다.

1. Sections.nsh 라는 NSIS에서 제공하는 섹션 관리 헤더파일 참조.

2. 섹션에 섹션인덱스 값을 부여한다.

3. .onInit 함수에 섹션의 선택값을 특정 변수에 저장한다. (주로 $1같은 변수..)

4. .selOnChange 에서 매크로를 이용하여 구현한다.



1.일단 기본적으로 Section 관련 내용을 선언해둔 파일을 집어넣어야 합니다.


!include "Sections.nsh"

이걸로 자신의 스크립트안에 섹션 관리 헤더파일을 집어넣습니다.

2.이제 섹션에 섹션 인덱스 값을 부여해야죠

예) Section "fsfds" abc

이렇게 하면 fsfds라는 섹션에 abc라는 섹션인덱스 변수를 설정한 것 입니다.

NSIS는 abc라는 섹션인덱스 변수를 통해 fsfds에 접근하는거죠

abc는 NSIS에서 쓸때는 ${abc}라고 적습니다.

3. 이제 .onInit 함수를 만듭니다.

예)

Function .onInit

  StrCpy $1 ${g1o1}
FunctionEnd

만액, Section "fsfds" abc

Section "qwrqweq" qew

이렇게 두 개의 섹션을 라디오 버튼으로 만들려고 하고 이중에 abc를 기본선택으로 두려면 위와 같이 함수를 만들면 됩니다.

4. .onSelChange 함수를 만듭니다.

Function .onSelChange

  !insertmacro StartRadioButtons $1
  !insertmacro RadioButton ${abc}
  !insertmacro RadioButton ${qew}
!insertmacro EndRadioButtons

FunctionEnd

abc와 qew라는 섹션 인덱스가 어디에 쓰였는지만 보면 쉽게 적용가능합니다.

댓글을 달아 주세요

  1. jsmbest 2011.10.27 17:33 Address Modify/Delete Reply

    예제스크립트 하나를 알려주세요

NSIS에 대해서 훑어보기 식으로 알아보겠습니다.

NSIS의 장점 :

파일크기가 작다.

거의대부분의 윈도와 호환된다.

특수한 압축방식으로 최소한의 오버헤드와 따로 자동압축풀림 기능을 사용할 필요가 없습니다.

스크립트 방식으로 인스톨러의 모든 동작을 직접 제어할 수 있습니다.

다국어를 지원합니다.

인터페이스나 대화상자를 편집할 수 있습니다.

필요한 기능은 플러그인으로 추가할 수 있습니다.

웹을 통한 설치, 패치를 지원합니다.

NSIS는 쉽게 하나의 설치마법사에 여러 프로젝트를 통합하거나 라이트, 풀 버전등을 만듭니다.

간단한 NSIS 문법:

NSIS는 기본적으로 간단한 텍스트 파일입니다.

주석 :

";", "#" 이후의 문장은 주석입니다.

/* 와 */ 사이의 문장은 주석입니다.

명령:

명령 (인자)  입니다.

예) File "myfile.exe"

플러그인 : 플러그인 이름::명령 (인자)

숫자 :

10진수 - 일반적인 수

16진수 - 앞에  0x를 붙입니다.

8진수 - 앞에 0를 붙입니다.

색표현 - HTML 표현방식을 따르지만 앞에 #를 붙이지 않습니다.

문자열 :

'' 와 " 를 모두 사용할 수 있습니다.

"Hi There" -> Hi There

"I''ll be happy" -> I''ll be happy

`And he said to me "I''ll be fucked!"` -> And he said to "I''ll be fucked"

NSIS는 제어문자로 $ 를 사용합니다.

변수 : 변수명 앞에 $를 붙입니다.

- 명령이 긴 경우 명령의 끝에 를 붙인 후 다음 줄에 이어서 적으면 됩니다.



NSIS - Section 이란?

NSIS - Page 에 대해서...

NSIS - Section 이란?

NSIS에 있어서 섹션이란 매우 중요합니다.

섹션은 보통, 다른 설치마법사 제작기에서 다른 이름으로 많이 있습니다.

컴포넌트, 기능(Feature), 구성요소 등으로 말이죠.

이름만 다르고 이들과 하는 일은 같습니다.

즉, 제작자가 어떤 프로그램을 설치하려고 할때 그 프로그램을 구성하는 하나의 구성요소 라고 할 수 있습니다.

파일이 모여서 섹션이 되고 섹션이 모여서 프로그램이 되는거죠.

NSIS - Page 에 대해서...

  NSIS로 만들 수 있는 설치마법사 중 대개는 화면에 뭔가 보여주면서 선택을 하게 됩니다. 당연한가요? Page에 관련된 일련의 명령들은 바로 이러한 화면을 제어합니다. 순서, 보여지는 형태, 언어, 동작 등 많은 것들을 제어합니다. 또한, NSIS에서는 NSIS에서 내장해서 자체적으로 제공하는 화면 말고 CustomPage 라고 하여 사용자가 원하는 화면을 만들어서 보여줄 수 있습니다. (InstallOptions 라는 플러그인이 있고, Codec xPack에서 ffdshow 옵션을 설정하는 화면에서 쓰였습니다.)

 페이지를 다룰때는 일단 기본적으로 Page, UninstPage(설치제거용) 두가지 명령을 쓰며 Page나 UninstPage의 확장판으로 PageEx라는 명령이 있습니다.

  일단 페이지를 만든다고 치면 각 페이지들의 순서를 정해야 할 것입니다. 여기서 NSIS스크립트만의 편리성이 드러납니다. NSIS 스크립트는 위에서 아래로 차례로 순차적으로 실행된다고 언급한 적이 있습니다. 즉, 배열하려는 Page 순서대로 스크립트에서 한줄씩 차례대로 적어주기만 하면 됩니다.

ex) Page license;

   Page components

이렇게 적으면 NSIS는 라이센스 화면을 보여주고 다음에 컴포넌트 선택 화면을 보여줍니다.

  NSIS에서 자체적으로 제공하는 페이지들.. (license, components, directory, instfiles, uninstConfirm) 입니다. instfiles는 설치/제거 모두에 쓰입니다.

  또한 이렇게 순서만 정하면 재미가 없을겁니다. NSIS에서는 이렇게 순서를 정하면서 동시에 간단한 동작이나 형태를 지정해 줄 수 있습니다. 물론, 이렇게 하기위해서는 NSIS의 함수에 대해서 알아야합니다. 또한, Page, UninstPage 의 인자에 대해서도 알아야겠죠.

Page

custom [creator_function] [leave_function] [caption]   OR (license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function] 

UninstPage

custom [creator_function] [leave_function] [caption]   OR (license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function] 

입니다.~

질문은 밑에 적어주세요~

Sections

섹션이란 앞에서도 언급했듯이 NSIS란 설치관리자의 핵심을 이루는 것입니다. NSIS는 반드시 하나 이상의 섹션을 포함해야하며 이 섹션들은 아래와 같은 규칙하에 그 밑의 명령들로 관리됩니다.

. 각 섹션은 0개 이상의 명령을 포함합니다. (하나도 없을 수도 있습니다).

. 섹션은 설치마법사에의해 순서대로 실행되며 ComponentText 가 설정되어 있다면 사용자는 각 보이는 섹션을 선택하거나 해제할 수 있습니다.

. 만약 섹션의 이름이 ''Uninstall'' 이거나 섹션 이름앞에 ''un.'' 이라는 접두어를 붙이면 이것은 설치제거때에만 쓰입니다.



- Section Commands

AddSize size_kb

설치관리자에게 현재 섹션이 추가로 ''size_kb'' 키로바이트 만큼 필요하다고 알려줍니다. 이 명령은 오직 섹션에서만 유효합니다.

Section AddSize 500 SectionEnd 

Section

[/o] [([!]|[-])section_name] [section index output] 

새로운 섹션을 시작합니다. 만약 섹션이름이 빈공간이거나 - 로 시작하면 이 섹션은 숨김 속성을 가져서 사용자에게 보이지 않습니다. 만약 섹션이름이 ''Uninstall'' 이거나 ''un.''으로 시작하면 설치제거 섹션으로 사용됩니다. 섹션 인덱스 출력 변수가 설정되면 이 매개변수는 !defined 매크로에 의해 섹션 인덱스 값이 설정되고 SectionSetText 등의 관리명령에서 사용됩니다. 섹션이름이 !로 시작하면 굵은 글씨로 보이고 /o 를 설정하면 기본적으로 선택해제된 상태가 됩니다.

Section "-hidden section"
SectionEnd

Section # hidden section
SectionEnd

Section "!bold section"
SectionEnd

Section /o "optional"
SectionEnd

Section "install something" SEC_IDX
SectionEnd

SectionEnd

현재 열린 섹션을 닫습니다.

SectionIn

insttype_index [insttype_index] [RO] 

이 명령은 현재 섹션이 기본적으로 속하게 될 설치유형을 설정합니다.  복합적인 SectionIn 명령은 모두 합해져서 나타납니다. 만약 RO 매개변수를 지정하면 이 섹션은 읽기전용으로 사용자는 상태를 변경할 수 없습니다. 최로 설치 유형은 InstType 명령에 의해 최초 1부터 차례대로 붙어나갑니다.

InstType "full"
InstType "minimal"

Section "a section"
SectionIn 1 2
SectionEnd

Section "another section"
SectionIn 1
SectionEnd

SectionGroup

[/e] Caption [section_group_name index output] 

섹셕 그룹이란 섹션들을 포함하는 섹션으로 섹션들을 보기좋게 모아서 나타날 때 사용합니다.섹션 그룹을 설정하며 반드시 SectionGroupEnd 명령으로 닫아야 합니다. 또한 반드시 하나 이상의 섹션을 포함해야 합니다. !로 이름이 시작하면 굵은 글씨체로 나타납니다. /e 를 설정하면 섹션그룹은 펼쳐져서 나타납니다. 만약 섹션이름이 ''un.''으로 시작하면 설치제거 섹션으로 사용됩니다. 섹션 인덱스 출력 변수가 설정되면 이 매개변수는 !defined 매크로에 의해 섹션 인덱스 값이 설정되고 SectionSetText 등의 관리명령에서 사용됩니다.

SectionGroup "some stuff"
Section "a section"
SectionEnd
Section "another section"
SectionEnd
SectionGroupEnd

SectionGroupEnd

섹션그룹을 닫습니다.

Uninstall Section

''Uninstall'' 이라는 특별한 섹션은 설치제거마법사를 생성하기 위해 반드시 만들어야합니다. 이 섹션에서 설치했던 파일, 레지스트리 등을 삭제합니다.

Section "Uninstall"   Delete $INSTDIRUninst.exe ; delete self (see explanation below why this works)   Delete $INSTDIRmyApp.exe   RMDir $INSTDIR   DeleteRegKey HKLM SOFTWAREmyApp SectionEnd 

제일먼저 Delete 명령으로 설치제거마법사를 삭제합니다. 왜냐하면 설치제거마법사는 윈도 임시 디렉토리로 복사되어 그곳에서 실행되기 때문입니다.설치제거때 $INSTDIR 값은 설치제거마법사가 있는 곳입니다. 반드시 설치마법사가 있는 곳과 같지는 않습니다.

댓글을 달아 주세요

  1. tagui 2009.05.28 16:21 Address Modify/Delete Reply

    좋은정보 감사합니다.
    블로그에 출처를 밝히고 스크랩할께요~

nsWeb - NSIS 에서 웹페이지를 보여주는 플러그인 입니다.

이번 코덱팩 업데이트 때 사용된 웹페이지를 보여주는 플러그인입니다.

의외로 다양한 기능을 보유하고 있습니다.

ShowWebInPage.- 사용자 페이지 대화상자에 URL 또는 HTML 파일을 출력합니다.
ShowHTMLInPage.- 사용자 페이지 대화상자에 HTML 문자열(body 태그등이 없는 HTML 형식 문자열)을 출력합니다.
ShowWebInPopUp.- 사용자 페이지 대화상자에 URL 또는 HTML 파일을 출력합니다.(HTML형식 문자열은 안됩니다)

IsInet.- 인터넷 연결이 되어 있는지 확인합니다. 이 함수를 사용해서 URL 을 출력할 때 페이지를 찾을 수 없다는 오류를 피할 수 있겠지요. (1=연결; 0=연결 안 됨)

참조 페이지 "http://nsis.sourceforge.net/NsWeb:_A_plugin_to_display_the_web_browser_control_in_a_custom_page"

기본적으로 위와 같은 4가지 함수를 가지고 있습니다.

설치하면 예제 디렉토리에 Modern UI와 기본 UI 두가지의 예제 파일들이 설치됩니다.

밑에 2가지 예제를 보시면 쉽게 이해가 가실겁니다.

일단 젤 처음에 Page 함수를 사용해서 자신이 사용할 페이지를 하나 생성합니다.

  그 후 인스톨러 처음 시작할 때 호출되는 함수인 .onInit 에서 플러그임을 초기화합니다. 이때 플러그인과 함께 HTML파일을 보여줄 것이라면 HTML파일도 같이 풀어줘야합니다.

그 후 Page 함수에서 설정한 이름으로 함수를 작성하여주면 NSIS가 알아서 호출하여 줍니다.

그리 어렵지 않아서 예제를 컴파일해서 직접 돌려보고 한번 보시면 아실 수 있을겁니다.

; Example with classic NSIS style
Name nsWeb
OutFile nsWeb-CUI.exe
InstallDir $EXEDIR
ShowInstDetails show
XPStyle on

Page directory
;  custom 다음의 ShowWebControl 이 이 페이지가 보여질 필요가 있을때 호출되는 함수입니다, 다음의 "" 은 이 페이지 나갈 때 호출되는 함수이름입니다 없으면 ""로 비워둡니다 그담은 페이지 제목창에 나타날 글입니다
Page custom "ShowWebControl" "" ": WebBrowser control web dialog"  ; NsWeb에서 사용할 페이지 설정,
Page custom "ShowHTMLControl" "" ": WebBrowser control html file dialog" ; NsWeb에서 사용할 페이지 설정
Page custom "ShowHTMLText" "" ": WebBrowser control html text dialog" ; NsWeb에서 사용할 페이지 설정
Page components "" "ShowPopURL" "" ; NsWeb에서 사용할 페이지 설정
Page instfiles

Function .onInit ; 플러그인 초기화를 합니다
InitPluginsDir
# Drop everything into the $PLUGINSDIR on init.
# For quick calling at its time
File /oname=$PLUGINSDIR\nsWeb.dll ${NSISDIR}\Plugins\nsWeb.dll ; 플러그인을 풀고
File /oname=$PLUGINSDIR\file1.htm file1.htm ; 플러그인에서 보여줄 htm 파일을 풀어줍니다
File /oname=$PLUGINSDIR\file2.htm file2.htm
FunctionEnd

Function "ShowWebControl"
nsWeb::ShowWebInPage "http://www.google.com.mx" ; 페이지가 보여질 때 함수를 호출합니다.
FunctionEnd

Function "ShowHTMLControl"
nsWeb::ShowWebInPage "$PLUGINSDIR\file1.htm"
FunctionEnd

Function "ShowHTMLText"
nsWeb::ShowHTMLInPage "<b>I'm a <u>HTML text</u></b>"
FunctionEnd

Function "ShowPopURL"
nsWeb::ShowWebInPopUp "$PLUGINSDIR\file2.htm"
FunctionEnd

Section "Detect Internet?"
nsWeb::IsInet 3
DetailPrint "Do you have Internet connection: $3"
SectionEnd

Section -default
DetailPrint "It's over!"
SectionEnd


; Example with Modern UI NSIS style

!include "MUI.nsh"

Name nsWeb
OutFile nsWeb-MUI.exe
InstallDir $EXEDIR
ShowInstDetails show
XPStyle on

!insertmacro MUI_PAGE_DIRECTORY
Page custom "ShowWebControl" "" ": WebBrowser control web dialog"
Page custom "ShowHTMLControl" "" ": WebBrowser control html file dialog"
Page custom "ShowHTMLText" "" ": WebBrowser control html text dialog"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "ShowPopURL"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Function .onInit
InitPluginsDir
# Drop everything into the $PLUGINSDIR on init.
# For quick calling at its time
File /oname=$PLUGINSDIR\nsWeb.dll ${NSISDIR}\Plugins\nsWeb.dll
File /oname=$PLUGINSDIR\file1.htm file1.htm
File /oname=$PLUGINSDIR\file2.htm file2.htm
FunctionEnd

Function "ShowWebControl"
!insertmacro MUI_HEADER_TEXT "Testing nsWeb plugin" "You are watching http://nsis.sf.net"
nsWeb::ShowWebInPage "http://nsis.sf.net"
FunctionEnd

Function "ShowHTMLControl"
!insertmacro MUI_HEADER_TEXT "Testing nsWeb plugin" "You are watching file1.htm"
nsWeb::ShowWebInPage "$PLUGINSDIR\file1.htm"
FunctionEnd

Function "ShowHTMLText"
!insertmacro MUI_HEADER_TEXT "Testing nsWeb plugin" "You are watching plain HTML text"
nsWeb::ShowHTMLInPage "<b>I'm a <u>HTML text</u></b>"
FunctionEnd

Function "ShowPopURL"
nsWeb::ShowWebInPopUp "$PLUGINSDIR\file2.htm"
FunctionEnd

Section "Detect Internet?"
nsWeb::IsInet 3
DetailPrint "Do you have Internet connection: $3"
SectionEnd

Section -default
DetailPrint "It's over!"
SectionEnd

댓글을 달아 주세요

  1. solhyang83@lycos.co.kr 2009.04.16 12:30 Address Modify/Delete Reply

    한 페이지에 두 개의 웹페이지나 웹파일을 보여주는 건 안 돼나요?

헬마입니다.

이번에는 NSIS 에서 윈도 OS 정보를 얻어내는 플러그인입니다.

NSIS 로 OS 버전 알아내기

이 플러그인은 매우 간단합니다. 덜렁 함수 2개로 구성되어 있으며 필요에 따라 하나씩 호출하고 반환되는 값을 보고 판단하면 됩니다.

OS 버전을 알고 싶을 때
1) Call osversion ; OS 버전을 알려주는 함수를 호출합니다.
2) OS의 주요 버전은 $0 에 부가 버전은 $1 에 반환됩니다.

OS 플랫폼을 알고 싶을 때
1) Call osplatform ; OS 플랫폼을 알려주는 함수를 호출합니다.
2) $0 에 들어온 값을 분석합니다.
  $0 에는 'win31', 'win9x', 'winnt', 와 'unknown' 중의 하나가 들어갑니다.

버전 넘버 판별
--------------------------------
주요 버전:
  Windows 95   4
  Windows 98   4
  Windows Me   4
  Windows NT 3.51  3
  Windows NT 4.0  4
  Windows 2000   5
  Windows XP   5
  Windows .NET Server  5

부가 버전
  Windows 95   0
  Windows 98   10
  Windows Me   90
  Windows NT 3.51  51
  Windows NT 4.0  0
  Windows 2000   0
  Windows XP   1
  Windows .NET Server  1

예제
-------

; Copyright (C) 2001 Robert Rainwater

Name "NSIS OS Extension Example" ; 이름
OutFile "example.exe" ; 작성 파일

InstallDir $TEMP\nsisos
DirShow hide

ShowInstDetails show
AutoCloseWindow false

Function .onInit
SetSilent silent
FunctionEnd

Section -
; nsisos.dll 파일이 플러그인 폴더가 아닌 스크립트와 같은 폴더에 있어야 합니다.
File /oname=$TEMP\nsisos.dll nsisos.dll ;플러그인을 임시 디렉토리에 압축을 해제합니다.
CallInstDLL $TEMP\nsisos.dll osversion ; 플러그인을 호출합니다. osversion 함수를 호출합니다.
StrCpy $R0 $0 ; $0 과 $1 에는 숫자가 들어있습니다.
StrCpy $R1 $1
CallInstDLL $TEMP\nsisos.dll osplatform ; osplatform 함수를 호출합니다.
StrCpy $R2 $0
MessageBox MB_OK "Major Version: $R0 $\nMinor Version: $R1 $\nPlatform: $R2" ; 반환 받은 정보를 출력합니다.
Delete $TEMP\nsisos.dll
SectionEnd

또는 nsisos.dll 파일을 NSIS의 플러그인 디렉토리에 넣었다면
nsisos::osversion ; osversion 함수 호출
nsisos::osplatform ; osplatform 함수 호출
위와 같은 형식으로 호출할 수 있습니다.

댓글을 달아 주세요

헬마입니다.

오랜만에 글을 쓰는군요.

이번에는 NSIS에서 플러그인을 사용해 CPU 정보를 얻어내 볼까 합니다.

코덱팩에서 유용하게 쓰인 플러그인입니다.

주로 CPU 종류별로 프로그램을 설치하거나 할 때 쓰입니다.

준비물 : NSIS, Cpudesc 플러그인

이 플러그인은 호출하면 변수에 특정형식으로 된 긴 문자열을 반환합니다. 그러면 사용자는 이 문자열에서 지정된 위치를 문자를 읽어보고 정보를 얻어내는 형태입니다.

이 플러그인을 호출하고 $0 값을 스택에서 꺼내어 보면 아래와 같은 형식으로 정보가 저장되어 있습니다.

<도움말에서...>

INTELP=d AMD=add PPRO=b MMX=d SSE=b SSE2=b 3DNOW=d ARCH=dd LEVEL=dd NCPU=dd MHZ=ddddd RAM=dddd

d -> 숫자를 나타냅니다. d가 2개면 두자리 숫자라는 뜻이지요.
a -> 문자를 나타냅니다. 알파벳 A-Z 까지입니다.
b -> 논리값을 나타내기 위한 숫자값입니다. 0 또는 1입니다.

INTELP: 값 범위 [0..4].
  0:    인텔 CPU가 아니거나 매우 매우 오래된 인텔 CPU
  1:    Pentium 또는 Pentium MMX. 즉, MMX 지원여부는 MMX 를 다시한번 확인해봐야합니다.
  2:    Pentium Pro, II 또는 Celeron.
       펜티엄 프로는 MMX가 없기때문에 역시 MMX 지원여부는 따로 확인해야합니다.
  3:    Pentium III 또는 P3 (구형) Xeon.   MMX 와 SSE 를 지원합니다.
  4:    Pentium IV 또는 (신형) Xeon.   MMX, SSE, SSE2 를 지원합니다.
AMD:    좀 복잡합니다....
  000:  AMD CPU가 아니거나 매우 매우 오래된 AMD CPU
  Kdd:  구형 K 시리즈..   "dd" 값은 K5의 05 또는 K6의 06
       펜티엄 호환. K5는 MMX나 3dnow 지원안함. k6 는 표준 MMX 를 지원하며 후기 모델은 표준 3d now 지원
  Add:  애슬론 또는 듀론.   "dd" 는 모델넘버로 01 부터 10까지. 모든 모델은 확장 MMX와 확장 3D NOW 지원.
       SSE는 지원하지 않음. 펜티엄 2 호환.
  Odd:  옵테론.   "dd" 는 모델 넘버
       펜티엄 4 호환.
PPRO:   값 범위 [0..1]
  0:    인텔 펜티엄 프로와 호환성 없음
  1:    인텔 펜티엄 프로와 호환
MMX:    Values range [0..2].
  0:    MMX 지원 안 함
  1:    표준 인텔 MMX
  2:    표준 MMX 와 AMD MMX
SSE:    Values range [0..1].
  0:    SSE 지원 안 함
  1:    SSE 지원 함
SSE2:   Values range [0..1].
  0:    SSE2 지원 안 함
  1:    SSE2 지원
3DNOW:  Values range [0..2].
  0:    3D NOW 지원 안 함
  1:    표준 3D NOW
  2:    표준, 확장 3D NOW
ARCH:   Values range [00..10].
  00:   32-bit 인텔 또는 그 호환
  01:   MIPS (NT 3.5용)
  02:   DEC Alpha.  
  03:   PowerPC
  04:   SHX (?)
  05:   ARM (Acorn Risc Machine, 윈도가 돌아가던가??)
  06:   64-bit Intel.
  07:   64-bit Alpha
  08:   MSIL (?)
  09:   64-bit AMD
  10:   32-bit Intel doing Win64 (?)
LEVEL:  "Processor level", like what you see in the main processor environment
       variable.   Sort-of useless for Intel architecture.
NCPU:   프로세서 숫자(아마도 하이퍼 스레딩이 영향을 미치리라 예상함)
MHZ:    The CPU's internal clock speed in MHz (Approx).
RAM:    반올림한 물리 메모리 용량 (메가바이트 단위)


INTELP=d AMD=add PPRO=b MMX=d SSE=b SSE2=b 3DNOW=d ARCH=dd LEVEL=dd NCPU=dd MHZ=ddddd RAM=dddd

간단한 예제
  cpudesc::tell  ; cpudesc 플러그인을 호출합니다.
  Pop $0                     ; 스택에 저장된 $0 를 꺼냅니다
  StrCpy $1 $0 1, 22         ; $0 문자열의 22번째 위치에서 한 글자를 읽어 $1에 저장. 'PPRO=' 다음 글자
  IntFmt $2 "%u" $1          ; 읽어온 글자인 $1를 숫자형식으로 변환하여 $2에 저장
  IntCmpU $2 1 +1 +3 +3      ; $2와 1을 비교하여 같으면(펜티엄 프로이면) 바로 진행하고 같지 않으면(펜티엄 프로가 아니면) 3번째 명령 위치로 이동하여 그 명령을 실행
  File /oname=blog.exe "blog_source_directory\blog_pro.exe"  ; 프로용 파일 설치
  Goto +2 ; 일반 적인 파일 설치 부분을 건너뛰기 위해 실행 위치를 +2 만큼 이동
  File /oname=blog.exe "blog_source_directory\blog_gen.exe" ; 일반적인 파일 설치
... 나머지 명령...


댓글을 달아 주세요