2016년 4월 16일 토요일

[Inno Setup] 6. 설치 마법사 절차와 스크립트

스크립트 코드로 설치 마법사 절차 엿보기

Inno Setup으로 만들어진 설치 프로그램을 실행하면 동작하는 설치 마법사의 절차를 스크립트와 비교하면서 학습해 보기로 합시다.
설치 마법사가 동작되는 순서는 스크립트의 [Code] 세션 부분입니다. [Code] 세션은 파스칼 스크립트로 작성되어 있으며 파스칼을 모르는 사람이라도 아래 그림과 스크립트를 비교하면서 설명해 보겠습니다.

1. 입력 박스 추가 페이지 만들기

[Code]
var  UserPage: TInputQueryWizardPage;
procedure InitializeWizard;
begin
{
Create the pages
}  

{  
// edit box가 포함되어 있는 마법사 페이지를 생성한다.  
// AfterID: Integer = wpWelcome  
// ACaption: String = 'Personal Information'  
// ADescription: String = 'Who are you?'  
// ASubCaption: String = 'Please specify your name and the company for whom you work, then click Next.'  
}  

UserPage := CreateInputQueryPage(wpWelcome,  
'Personal Information', 
'Who are you?',  
'Please specify your name and the company for whom you work, then click Next.'); 
{
// edit box 아이템을 추가한다.  
// APrompt: String = 'Name:'  
// APassword: Boolean = False(Password edit가 아니라는 것을 의미)  
}  
UserPage.Add('Name:', False);  
UserPage.Add('Company:', False);

2. 옵션 버튼 추가 페이지 만들기

[Code]
var  UsagePage: TInputOptionWizardPage;
procedure InitializeWizard;
begin 
{
Create the pages 
}  
{  
// 체크 또는 옵션 버튼이 포함되어 있는 마법사 페이지를 생성한다.  
// AfterID: Integer = UserPage.ID  
// ACaption: String = 'Personal Information' 
// ADescription: String = 'How will you use My Program?' 
// ASubCaption: String = 'Please specify how you would like to use My Program, then click Next.'  
// Exclusive: Boolean = True (옵션 버튼이 체크 박스 대신 표시되며 한개만 선택할 수 있음)  
// ListBox: Boolean = False (만약, True일 경우 라디오 버튼 또는 체크 박스를 리스트 박스 안에 위치시킨다)  
}  
UsagePage := CreateInputOptionPage(UserPage.ID,    
'Personal Information', 
'How will you use My Program?',    
'Please specify how you would like to use My Program, then click Next.',    
True, False);  
{  
// 아이템을 추가한다.  
// ACaption: String = 'Light mode (no ads, limited functionality)'  
}  
UsagePage.Add('Light mode (no ads, limited functionality)');  
UsagePage.Add('Sponsored mode (with ads, full functionality)');  
UsagePage.Add('Paid mode (no ads, full functionality)');

3. 메시지출력 페이지 만들기

[Code]
var  LightMsgPage: TOutputMsgWizardPage;
procedure InitializeWizard;
begin  

Create the pages 
}  
{  
// 메시지가 포함되어 있는 마법사 페이지를 생성한다.  
// AfterID: Integer = UsagePage.ID  
// ACaption: String = 'Personal Information' 
// ADescription: String = 'How will you use My Program?'  
// ASubCaption: String = 'Note: to enjoy all features My Program can offer and to support its development, ' +  
//                              'you can switch to sponsored or paid mode at any time by selecting ''Usage Mode'' ' +  
//                              'in the ''Help'' menu of My Program after the installation has completed.'#13#13 +  
//                              'Click Back if you want to change your usage mode setting now, or click Next to ' +  
//                              'continue with the installation.'  
}  
LightMsgPage := CreateOutputMsgPage(UsagePage.ID,    
'Personal Information', 'How will you use My Program?',    
'Note: to enjoy all features My Program can offer and to support its development, ' +  
'you can switch to sponsored or paid mode at any time by selecting ''Usage Mode'' ' +    
'in the ''Help'' menu of My Program after the installation has completed.'#13#13 +    
'Click Back if you want to change your usage mode setting now, or click Next to ' +    
'continue with the installation.');

4. 디렉토리 선택 페이지 만들기

[Code]
var  DataDirPage: TInputDirWizardPage;
procedure InitializeWizard;
begin  

Create the pages 
}  
{  
// 디렉토리 선택을 위해서 edit 박스와 찾아보기 버튼이 포함되어 있는 마법사 페이지를 생성한다.  
// AfterID: Integer = wpSelectDir  
// ACaption: String = 'Select Personal Data Directory'  
// ADescription: String = 'Where should personal data files be installed?'  
// ASubCaption: String = 'Select the folder in which Setup should install personal data files, then click Next.'  
// AAppendDir: Boolean = False (True일 경우, ANewFolderName 값은 사용자 클릭한 폴더 이름으로 추가된다)  
// ANewFolderName: String = ''  
// AApendDir = False 이면서 ANewFolderName이 공백일 경우 표시된 기본 이름으로 새로운 폴더를 생성하고 표시한다.  
}  
DataDirPage := CreateInputDirPage(wpSelectDir,    
'Select Personal Data Directory', 
'Where should personal data files be installed?',    
'Select the folder in which Setup should install personal data files, then click Next.',    
False, '');  
{  
// 아이템을 추가한다.  
// APrompt: String = ''  
DataDirPage.Add('');
}

5. 레지스트리 키 입력 페이지 만들기

[Code]
var  KeyPage: TInputQueryWizardPage;
procedure InitializeWizard;
begin  

Create the pages 
}  
{  
// 입력 창이 포함되어 있는 마법사 페이지를 생성한다. 
// AfterID: Integer = wpSelectDir  
// ACaption: String = 'Personal Information'  
// ADescription: String = 'What''s your registration key?'  
// ASubCaption: String = 'Please specify your registration key and click Next to continue. If you don''t ' +  
//                              'have a valid registration key, click Back to choose a different usage mode.'  
}  
KeyPage := CreateInputQueryPage(UsagePage.ID,    
'Personal Information', 
'What''s your registration key?',    
'Please specify your registration key and click Next to continue. If you don''t ' +    
'have a valid registration key, click Back to choose a different usage mode.');  
{  
// edit box 아이템을 추가한다.  
// APrompt: String = 'Registration key:'  
// APassword: Boolean = False (Password edit가 아니라는 것을 의미)  
}  
KeyPage.Add('Registration key:', False);

6. 진행상태표시 페이지 만들기

[Code]
var  ProgressPage: TOutputProgressWizardPage;
procedure InitializeWizard;
begin  

Create the pages 
}  
{  
// 진행바가 포함되어 있는 마법사 페이지를 생성한다.  
// 다만, 본 페이지는 기본적으로 숨겨서 처리한다  
// ACaption: String = 'Personal Information'  
// ADescription: String = 'What''s your registration key?'  
}  
ProgressPage := CreateOutputProgressPage('Personal Information',    
'What''s your registration key?');
function NextButtonClick(CurPageID: Integer): Boolean;
var  I: Integer;
begin  
if CurPageID = KeyPage.ID then 
begin    

Just to show how 'OutputProgress' pages work.      
Always use a try..finally between the Show and Hide calls as shown below. 
}    
ProgressPage.SetText('Authorizing registration key...', '');    
ProgressPage.SetProgress(0, 0);    
ProgressPage.Show;    
try      
for I := 0 to 10 do 
begin        
ProgressPage.SetProgress(I, 10);        
Sleep(100);      
end;    
finally      
ProgressPage.Hide;    
end;  
end;
end;

[Inno Setup] 5. 마법사로 설치 프로그램 만들기

마법사 페이지로 설치 프로그램 만들기

Inno Setup을 실행하여 새로운 설치 프로그램 작성버튼을 클릭하면 마법사 페이지가 호출됩니다.

1. 새로운 설치 프로그램 작성하기

2. 마법사 시작

3. 어플리케이션 정보 입력

체크된 부분은 필수 사항

  • Application name: 어플리케이션 이름을 기록하며, 스크립트에서는 [Setup] 세션의 AppName 키로 사용
  • Application version: 어플리케이션 버전을 기록하며, 스크립트에서는 [Setup] 세션의 AppVersion 키로 사용
  • Application publisher: 어플리케이션 제작자를 기록하며, 스크립트에서는 [Setup] 세션의 AppPublisher 키로 사용
  • Application website: 어플리케이션 제작자의 웹사이트를 기록하며, 스크립트에서는 [Setup] 세션의 AppPublisherURL, AppSupportURL, AppUpdatesURL 키로 사용

4. 어플리케이션 폴더 지정

체크된 부분은 필수 사항

  • Application destination base folder: 어플리케이션이 설치될 기본 폴더를 지정하며, 스크립트에서는 [Setup] 세션의 DefaultDirName 키로 사용(Program Files folder={pf} 예약어 사용)
  • Application folder name: 어플리케이션이 설치될 폴더 이름을 기록하며, 위의 기본 폴더 아래에 입력된 이름의 폴더가 만들진다.

5. 어플리케이션 파일 추가

체크된 부분은 필수 사항

  • Application main executable file: 어플리케이션 메인 실행 파일을 선택하며, 스크립트에서는 [Files] 세션의 Source: "파일의 전체 경로"; DestDir: "{app}"; Flags: ignoreversion 
  • Add file(s): 파일을 추가하며, 설치시 배포합니다. 스크립트에서는 [Files] 세션의 Source: "파일의 전체 경로"; DestDir: "{app}"; Flags: ignoreversion
  • Add Folder...: 폴더를 추가하며, 폴더에 포함된 모든 파일과 폴더를 설치시 배포합니다.
  • Edit...: 추가된 파일 또는 폴더를 편집합니다. 파일일 경우, 스크립트에서는 [Files] 세션의 Source: "파일의 전체 경로"; DestDir: "tiff"; Flags: ignoreversion (c:\windows\sysWow64 폴더 아래에 tiff 폴더를 생성하여 해당 파일을 복사한다)

체크된 부분은 필수 사항

  • Remove : 추가된 파일 또는 폴더를 제거합니다.

6. 어플리케이션 바로가기 지정

7. 어플리케이션 관련 정보 파일 지정

*.rtf, *.txt 파일을 지정

  • License file: 라이선스 파일을 지정한다.
  • Information file shown before installation: 설치 전에 보여주는 정보 파일을 선택한다.
  • Information file shown after installation: 설치 후에 보여주는 정보 파일을 선택한다.

8. 설치 언어 선택

선택 항목은 필수 사항

9. 컴파일러 설정


  • Custom compiler output folder: 컴파일하여 저장할 폴더를 지정하며, 스크립트에서는 [Setup] 세션의 OutputDir 키를 사용
  • Compiler output base file name: 컴파일하여 저장할 설치 파일이름을 지정하며, 스크립트에서는 [Setup] 세션의 OutputBaseFilename 키를 사용
  • Custom Setup Icon file: 설치 파일에 적용할 아이콘을 지정합니다.
  • Setup password: 설치 파일의 비밀번호를 설정합니다.

10. 전처리 선언

스크립트의 #define 을 참조

11. 마법사 종료

12. 스크립트 실행

스크립트 컴파일 알림
스크립트 저장 알림
신규 스크립트를 저장

13. 설치 프로그램 실행

설치 프로그램 만들기 성공
설치 프로그램 실행 화면

14. 마법사로 만든 스크립트

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "데브팜"
#define MyAppVersion "0.5"
#define MyAppPublisher "데브팜주식회사"
#define MyAppURL "http://www.devfarm.com/"
#define MyAppExeName "MyProg.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{2CEBDFAB-C3EE-4A46-8118-19A271E9D40D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputDir=D:\myWorks\mySetup\InnoSetup\output
OutputBaseFilename=DevFarmSetup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "korean"; MessagesFile: "compiler:Languages\Korean.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\sbscys\Downloads\BLOG HotSpot GC options cheat sheet v2.pdf"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\sbscys\Downloads\TIFF6.pdf"; DestDir: "tiff"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

2016년 4월 15일 금요일

[Inno Setup] 4. 스크립트 섹션에 대하여

스크립트 섹션 살펴보기

Inno Setup에서 설명하는 섹션에는 다음과 같습니다.
  • [Setup] 프로그램 전체에 대한 설정을 정의한다.
  • [Types] 설치방법 (간단/사용자 정의 등)을 정의한다.
  • [Components] 설치방법을 설정할 때 각각의 방법으로 설치되는 파일군(구성 요소)에 대해 정의한다.
  • [Tasks] 설치 프로세스를 사용자 측에서 상세하게 설정하는 경우에 각각의 처리(작업)에 대해 정의한다.
  • [Dirs] 설치시 설치 디렉토리 아래에 작성하는 디렉토리에 대해 정의한다. [Files] 섹션에서 디렉토리를 지정할 수 있으므로 빈 디렉토리를 작성하기 위해 작성된다.
  • [Files] 설치 파일을 정의한다.
  • [Icons] 설치시 생성하는 프로그램 등의 바로 가기 파일에 대해 정의한다.
  • [INI] .INI 파일을 사용하는 경우 설치시 .INI파일에 쓸 내용을 정의한다.
  • [InstallDelete] 설치시에 제거 할 파일이 있으면 정의한다.
  • [Languages] 프로그램이 사용하는 언어를 정의한다.
  • [Messages] 설치 프로그램에서 표시하는 문자열을 정의한다. 일반적으로 [Languages]에서 정의한 .isl 파일에서 모든 지정하고 있기 때문에 정의할 필요는 없다.
  • [CustomMessages] 설치 프로그램에서 사용자 정의 메시지를 표시할 경우에는 그 내용을 정의한다.
  • [LangOptions] 설치 프로그램에서 표시하는 문자를 글꼴, 크기 등을 정의한다. 일반적으로 [Languages]에서 정의한 .isl 파일에서 모든 지정하고 있기 때문에 정의할 필요는 없다.
  • [Registry] 설치 프로그램 레지스트리 키를 편집하는 경우, 그 내용을 정의한다.
  • [Run] 설치 프로그램 실행 후 실행되는 프로그램이 있으면 정의한다.
  • [UninstallDelete] 제거할 때 설치시 생성된 파일에서 디렉토리를 삭제하려면 그 내용을 정의한다. 설치 프로그램이 만든 INI 파일의 삭제 등을 기술한다.
  • [UninstallRun] 제거를 실행할 때 시작하는 프로그램이 있으면 정의한다.
  • [Code] 설치 프로그램 자체 처리를 하는 경우에 그 내용을 파스칼 스크립트로 정의한다.

[Inno Setup] 3. 설치 프로그램 만들기

간단한 설치 프로그램 만들기

Inno Setup을 사용하여 간단한 설치 프로그램을 작성하려고 합니다. 우선, Inno Setup을 시작합니다. 다음의 대화 상자가 표시되면 "Cancel" 를 클릭하세요.
아래의 스크립트를 붙여 빌드를 실행해 봅니다.

1. 스크립트작성

[Setup]
// 응용프로그램 이름
AppName = MyApp
// 응용프로그램 이름 + 버전
AppVerName = MyApp 1.0
// 아카이브 이름
OutputBaseFilename = MyApp
// 초기 설치 디렉토리
DefaultDirName = c:\Installtest

[Languages]
// 띄어쓰기에 조심할 것 compiler와 Languages는 붙여쓴다.
Name:korean; MessagesFile: "compiler:Languages\korean.isl"

2. 빌드실행


빌드를 실행하려면 스크립트를 먼저 저장해야 합니다. 스크립트가 저장되는 디렉토리 아래에 Output 이라는 디렉토리가 생성되고 그 디렉토리에 MyApp.exe 라는 설치파일이 생성되어 있습니다.

3. 설치 프로그램 실행

4. 프로그램 실행화면

5. 프로그램 제거


6. 설치정보 및 레지스트리 쓰기

Inno Setup은 설치 정보를 다음 키로 레지스트리에 기록합니다.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[AppName]_is1]
[AppName]은 [Setup] 섹션에서 AppName에 지정한 값입니다. 이 키에 기록된 값을 바탕으로 "프로그램 추가 삭제"에서 설치 정보 표시 및 제거 프로그램을 실행합니다.

이상이 프로그램 작성의 기본적인 흐름입니다.
설치 스크립트에는 [Setup]과 [Languages] 뿐만 아니라 설치 파일을 지정하는 섹션도 있습니다.

[Inno Setup] 2. 환경구축

설치하기

먼저 Inno Setup을 설치합니다. Inno Setup 다운로드 페이지를 방문하여 설치파일을 다운로드 후 설치를 실행합니다. Inno Setup을 설치하면 다음 디렉토리 파일이 생성됩니다.

1. Inno Setup 페이지 방문

2. 설치과정



3. Inno Setup 5.5 (설치 디렉토리)


  • Examples : Inno Setup 샘플 스크립트가 저장되어 있다.
  • Languages : Inno Setup으로 만드는 프로그램에서 사용하는 각 언어의 테이터 파일이 저장되어 있다. 초기 상태에서는 한국어 파일은 포함되어 있지 않습니다.
  • Inno Setup 5 : 프로그램 파일 등

4. 언어팩 설치하기

이 상태에서 만든 프로그램에서 한국어를 표시할 수 없기 때문에 한국어를 표시하도록 한국어 표시용 파일을 설치합니다. (다운로드 사이트 링크)

Inno Setup 5 (설치 디렉토리) 하위의 Languages 폴더에 Korean.isl 파일을 복사합니다.

5. 보안모듈 다운로드하기

보안모듈은 설치프로그램을 보호를 강화하기 위하여 암호화 모듈을 제공합니다.


[Inno Setup] 1. 오픈소스인 설치프로그램에 대하여

프로그램을 개발하는 개발자라면 배포에 대하여 고민을 하게 됩니다. 배포하는 방식에는 배포 파일의 형식에 따라 여러가지 방식들이 있습니다. 그 중에서 런타임파일(.exe) 즉, 실행파일은 배포하기 위해서 관련된 라이브러리 파일(dll) 과 리소스 파일(jpg, png 등) 등 여러개가 존재합니다.
나는 힘들게 고생하여 만든 어플리케이션을 배포를 잘못하여 고민하는 여러 개발자들을 접했습니다. 그래서, 공짜로 사용할 수 있는 설치 프로그램으로 누구나 손쉽게 배포할 수 있도록 하고자 오픈소스로된 설치 프로그램을 찾아 봤습니다.

Inno Setup (참고사이트)

설치 프로그램의 필요성

설치는 "프로그램의 동작에 필요한 파일을 설치할 컴퓨터에 복사한다" 는 것입니다. 예를 들어, 프로그램 파일을 zip 파일 등으로 압축하여 사용자가 압축파일 복사 및 배포를 부탁하는 것도 할 수 있습니다.
다만, 이와 같은 경우에는 배포하려는 프로그램 파일의 정보를 문서로 제공해야 하고, 사용자는 문서를 이해하여 압축 파일 복사 작업을 수행할 수 있도록 해야 합니다. 가급적 사용자가에게 부담없이 프로그램을 사용할 수 있도록 해야 합니다. 이렇게 만든어진 것이 프로그램이라고 할 수 있습니다.

설치 프로그램의 기능

지정된 디렉토리에 파일을 복사
설치 정보를 Windows 시스템(레지스트리)에 저장
제거 프로그램 만들기
스크립트를 작성하여 설치환경이나 프로그램 자체의 사양에 따라 설치 프로세스 사용 가능