バッドノウハウ IN THE SHELL

株式会社ドリーム・アーツ
竹迫 良範
http://namazu.org/~takesako/**

1

Inno Setup とは？
Windows インストーラ作成ソフト




動作環境







Jordan Russell (1997 ～ )Martijn Laan (2000 ～ )

開発環境




Windows 95/98/Me
Windows NT4.0/2000/XP/2003

オープンソースで開発が継続.iss ファイルから .exe を作成

Borland Delphi 2.0 ～ 5.0

多言語インストール対応


2004-05-14

英語・日本語も OK

http://www.jrsoftware.org/

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

2

設定ファイルからコンパイル（例）bad.iss → bad.exe[Setup]
AppName=BAD Know-How
AppVerName=BAD Know-How 5.14
DefaultDirName={pf}\BAD
Compression=lzma
SolidCompression=yes
ShowLanguageDialog=yes
LanguageDetectionMethod=uilanguage[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl";
Name: "ja"; MessagesFile: "compiler:Languages\Japanese.isl";[Files]
Source: "myprog.exe"; DestDir: "{app}"
Source: "myprog.hlp"; DestDir: "{app}\doc"
Source: "readme.txt"; DestDir: "{app}\doc"; Flags: isreadme

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

3

InstallShield
InstallShield Software Corporation
 Windows プラットフォームにおける業界標準のインストーラ開発ツール


InstallShield DevStudio 9.0 日本語版
事実上標準の商用製品
 スクリプトによるカスタマイズ機能

価格： ￥ 239,400- ※InstallShield for Microsoft Visual C++ 6
VisualStudio に付属（無償版）
 機能制限あり

http://www.installshield.com/※ 販売価格は常に変動する可能性があります

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

4

InstallStudio (Wise)

開発元 Wise Solutions 社


海外では Wise として有名
グレープシティ株式会社（旧文化オリエント株式会社）が日本市場向けに製品名を変更し、ローカライズ・販売・サポートInstallStudio 7.0J Enterprise

価格：￥ 197,400- ※InstallStudio 7.0J Professional


価格：￥ 134,400- ※http://www.grapecity.com/japan/support/database/Tool_ProductList.htm※ 販売価格は常に変動する可能性があります

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

5

EXEPress

株式会社ウェブテクノロジOPTPiX シリーズの開発元

ライセンスについて


フリー版
EXEpress CX フリー版の利用は個人のフリーソフトウェアの配布目的に限定 フリー版には広告ロゴが表示

プロフェッショナル版


企業・団体・法人で利用の場合は、目的の如何を問わず（フリーソフトウェアの配布であっても）、プロフェッショナル
ライセンスの購入が必要

http://www.webtech.co.jp/exepress/
2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

6

NSIS - Nullsoft Scriptable Install System

開発元 Nullsoft
Winamp を作っている会社
オープンソースとして公開
バージョン 2.0 から多言語インストール対応（英語・日本語もＯＫ）

http://nsis.sourceforge.net/home/

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

7

Inno Setup をお勧めする理由

オープンソースで開発が継続 (1997 ～ )現在のバージョンは 4.2.2 (2004-04-27)
全ソースコードが公開されているので安心

商用・非商用を問わず無償で利用可能
Papal.com / kagi.com で寄付受付中

My Inno Setup Extensions (Inno Setup 4 から同梱 )独自の Pascal Script でカスタマイズが可能

多言語対応（現在 45 ヶ国語のカタログが公開）
Arabic, Asturian, Belarus, Bulgarian, Catalan, Chinese (Simplified), Chinese (Traditional),
Croatian, Czech, Danish, Dutch, Estonian, Finnish, French, Galician, German, Greek, Hebrew,
Hungarian, Icelandic, Indonesian, Italian, Japanese, Korean, Lithuanian, Malaysian, Norwegian,Macedonian, Norwegian (nynorsk), Polish, Portuguese (Brazilian), Portuguese (Standard),
Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Spanish (Argentina), Spanish(Colombia), Spanish (Mexico), Spanish (Standard), Swedish, Thai, Turkish, Ukrainian

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

8

Inno Setup のサポート


なんとニュースグループが存在






fj 経験のある old type にも安心
new type には新鮮な NNTP
過去記事の検索も可能

メーリングリストも存在するが…


バージョンアップのアナウンスのみ
メールの屑に埋もれる必要なし

Inno Setup に関するニュースグループ
news://news.jrsoftware.org/jrsoftware.innosetup
news://news.jrsoftware.org/jrsoftware.innosetup.code
news://news.jrsoftware.org/jrsoftware.innosetup.thirdparty
2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

9あの NASA が Inno Setup を採用 !


Maestro

Maestro-Win.exe
NASA ジェット推進研究所が開発
 Java フリーソフト（ Windows 版）


火星探査車スピリット、オポテュニ
ティーの遠隔制御・画像収集・解析を行う「地球側」の管制プログラム


探査車のハードウェア仕様


MPU: RAD6000
OS: VxWorks

NASA で実績あり
http://mars.telascience.org/home
2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

10

実は Microsoft 社も利用していた !


Winter Fun Screensavers

screensaverfunpack.exe
Windows XP
 スクリーンセーバー集
InstallShield と Inno Setup
を組み合わせて利用

Microsoft も使っていた！

http://www.microsoft.com/windowsxp/experiences/downloads/screensavers.asp
2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

11

Namazu for Win32 に採用
Namazu 2.0.13(β 版 ) から Inno Setup でインストーラを作成
1 インストーラの国際化
日本語、英語の両言語メッセージを用意
2. 環境変数の自動設定
LANG, MKNMZRC, NAMAZURC, KANWADICTPATH,
ITAIJIDICTPATH, NAMAZULOCALEDIR, pkgdatadir
3. Windows NT4.0/2000/XP では、システムの再起動なしに
環境変数の設定を自動反映 (Win95/98/Me は未対応 )4. Perl 5.8 対応 (5.8.3 以上を推奨 )ActivePerl Build 500 系、 600 系のバイナリの他に
ActivePerl 5.8.3 Build 809 の PPM バイナリを追加
5. 同梱 Perl モジュール (PPM バイナリ ) のバージョンアップ
File-MMagic-1.22
NKF-2.0.4
Text-Kakasi-2.04 (Kakasi 2.3.4)
Search-Namazu-0.92 (Namazu 2.0.3RC13)
6. アンインストールが可能に
Namazu for Win32 のアンインストールプログラムが付属

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

12namazu.exe のビルドmake-namazu.sh (MinGW + MSYS の場合 )export MINGW32=yes
export CYGWIN=yes
export ac_cv_path_NKF=module_nkf
export ac_cv_path_KAKASI=module_kakasi
export ac_cv_path_CHASEN=chasenexport ac_cv_prog_LN_S=ln
export ac_cv_path_PERL=perl
CFLAGS=-O2 LIBS=-lintl ./configure --enable-nls \--prefix=/namazu --datadir=/namazu/share \--build=i386-pc-mingw32 --host= i386-pc-mingw32 \--enable-tknamazu --disable-file-mmagic-checking \--without-libiconv-prefix --without-libintl-prefix
make
make install※ 広瀬健一さんからノウハウを引き継ぎ2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

13

libnmz.dll のビルドmake-nmz-dll.sh (MS Visual C++6.0 + Cygwin の場合 )export MINGW32=yes
export CYGWIN=yes
export ac_cv_type_off_t=no
export ac_cv_header_dlfcn_h=no
export ac_cv_header_unistd_h=no
export ac_cv_header_nl_types_h=no
export ac_cv_header_sys_param_h=no
CC="cl" CFLAGS="-nologo -Gf -W3 -O1 -MD -DNO_ALLOCA -DMSVC" LD="lib -nologo" \./configure --prefix=/namazu --host=i386-pc-windows --build=i386-pc-windows \--enable-shared=no --disable-nls --disable-tknamazu --disable-file-mmagic-checking \--without-libiconv-prefix --without-libintl-prefix
cd lib; make all; OBJS=`echo *.obj`; lib -nologo -OUT:libnmzut.lib $OBJS; cd ..
Cd nmz; make all; OBJS=`echo *.obj`; lib -nologo -OUT:libnmz.lib $OBJS
echo "LIBRARY \"nmz\"" > nmz.def; echo "EXPORTS" >> nmz.def
for F in $OBJS; do
nm $F | grep 'T _' | sed 's/.* T _/ /' >> nmz.def
done
cl -nologo -Gf -W3 -O1 -MD -LD -Fenmz.dll $OBJS libnmzut.lib -link -def:nmz.def※ 広瀬健一さんからノウハウを引き継ぎ2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

14

(v)snprintf 問題
AC-Archive の AC_FUNC_SNPRINTF (m4 マクロ ) より
http://www.t3.rim.or.jp/~raeva/diary/?200305b#200305144#include <stdio.h>#include <stdarg.h>
int my_vsnprintf (char *buf, const char *tmpl, ...){
int i;
va_list args;
va_start (args, tmpl);
i = vsnprintf (buf, 2, tmpl, args);
va_end (args);
return i;}
int main(void){char bufs[5] = { 'x', 'x', 'x', ' \0', '\0' };char bufd[5] = { 'x', 'x', 'x', '\0', '\0' };int i;
i = my_vsnprintf (bufs, "%s", "111");
if (strcmp (bufs, "1")) exit (1);if (i != 3) exit (1);i = my_vsnprintf (bufd, "%d", 111);
if (strcmp (bufd, "1")) exit (1);if (i != 3) exit (1);exit(0);}2004-05-14

リンクする標準ライブラリによっては、戻り値が ISO C99 に準拠していない、あるいは NUL terminate しない実装がある( 例 ) MSVCRT.DLL の _vsnprintf#define vsnprintf _vsnprintf
Cygwin は独自の vsnprintf の実装を持っているので大丈夫だがWin32 native の環境では要注意

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

15

PL2BAT で mknmz.BAT を作成


ActivePerl が提供する PL2BAT （バッチファイルに変換）▼ Hello.pl▼ Hello.BAT#!perl -w#
use strict;print "Hello world!\n";1;

Perl スクリプト

PL2BAT Hello.pl
コマンドを実行BAT ファイルを作成
2004-05-14@rem = '--*-Perl-*-@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9goto endofperl:WinNT
perl -x -S %0 %*if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nulgoto endofperl@rem ';#!perl -w#line 15#
use strict;print "Hello world!\n";1;__END__:endofperl

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

16

.iss ファイル（ Namazu for Win32 の場合）
; -- nmz2013beta5.iss -; Namazu for Win32 installation.
[Setup]
AppName=Namazu for Win32
AppVersion=2.0.13beta5
AppVerName=Namazu 2.0.13beta5 for Win32
AppPublisher=Namazu Project
AppSupportUrl=http://www.namazu.org/windows/
AppCopyright=Copyright (C) 2000-2004 Namazu Project. All rights reserved.
Compression=lzma/max
SolidCompression=yes
DefaultGroupName=Namazu for Win32
DisableProgramGroupPage=no
UserInfoPage=no
DirExistsWarning=yes
AllowNoIcons=yes
AllowUNCPath=no
AllowRootDirectory=no
WindowVisible=yes
DefaultDirName={sd}\namazu
OutputBaseFilename=nmz2013beta5
ShowLanguageDialog=yes
LanguageDetectionMethod=uilanguage[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl";
InfoBeforeFile: "namazu\INFO-en.txt";
Name: "ja"; MessagesFile: "compiler:Default.isl,compiler:Languages\Japanese.isl"; InfoBeforeFile: "namazu\INFO-ja.txt";※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

17

.iss ファイル（ Files セクション）[Files]Components: main; Source: "namazu\*.*"; DestDir: "{app}";; Components: main; Source: "namazu\etc\namazu\*rc"; DestDir: "{app}\etc\namazu"; Flags: onlyifdoesntexist uninsneveruninstall;
Components: main; Source: "namazu\etc\namazu\mknmzrc"; DestDir: "{app}\etc\namazu"; Flags: confirmoverwrite uninsneveruninstall;
Components: main; Source: "namazu\etc\namazu\namazurc"; DestDir: "{app}\etc\namazu"; Flags: confirmoverwrite uninsneveruninstall;
Components: main; Source: "namazu\etc\namazu\*-sample"; DestDir: "{app}\etc\namazu";
Components: main; Source: "namazu\libexec\*.*"; DestDir: "{app}\libexec";
Components: main; Source: "namazu\bin\*.exe"; DestDir: "{app}\bin";Components: main; Source: "namazu\bin\*.bat"; DestDir: "{app}\bin";Components: main; Source: "namazu\bin\tknamazu"; DestDir: "{app}\bin";Components: main; Source: "namazu\share\tknamazu\*.*"; DestDir: "{app}\share\tknamazu";
Components: main; Source: "namazu\share\site-lisp\namazu\*.*"; DestDir: "{app}\share\site-lisp\namazu";
Components: main; Source: "namazu\share\namazu\template\*.*"; DestDir: "{app}\share\namazu\template";
Components: main; Source: "namazu\share\namazu\pl\*.*"; DestDir: "{app}\share\namazu\pl";Components: main; Source: "namazu\share\namazu\etc\*.*"; DestDir: "{app}\share\namazu\etc";
Components: main; Source: "namazu\share\namazu\doc\ja\*.*"; DestDir: "{app}\share\namazu\doc\ja";Components: main; Source: "namazu\share\namazu\doc\en\*.*"; DestDir: "{app}\share\namazu\doc\en";Components: main; Source: "namazu\share\namazu\doc\*.*"; DestDir: "{app}\share\namazu\doc";
Components: main; Source: "namazu\share\locale\ja_JP.SJIS\LC_MESSAGES\*.*"; DestDir: "{app}\share\locale\ja_JP.SJIS\LC_MESSAGES";
Components: main; Source: "namazu\share\locale\ja\LC_MESSAGES\*.*"; DestDir: "{app}\share\locale\ja\LC_MESSAGES";
Components: main; Source: "namazu\share\locale\fr\LC_MESSAGES\*.*"; DestDir: "{app}\share\locale\fr\LC_MESSAGES";
Components: main; Source: "namazu\share\locale\es\LC_MESSAGES\*.*"; DestDir: "{app}\share\locale\es\LC_MESSAGES";
Components: main; Source: "namazu\share\namazu\filter\*.*"; DestDir: "{app}\share\namazu\filter";Components: main; Source: "namazu\share\namazu\filter\win32\ichitaro456.pl"; DestDir: "{app}\share\namazu\filter\win32";
Components: ole; Source: "namazu\share\namazu\filter\win32\ole*.*"; DestDir: "{app}\share\namazu\filter\win32";
Components: main; Source: "namazu\var\namazu\index\dummy"; DestDir: "{app}\var\namazu\index";Components: main; Source: "namazu\man\man1\*.*"; DestDir: "{app}\man\man1";
Components: ppm; Source: "namazu\ppm\800\x86\*.*"; DestDir: "{app}\ppm\800\x86";
Components: ppm; Source: "namazu\ppm\800\*.*"; DestDir: "{app}\ppm\800";※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

18

.iss ファイル（ Types, Components ）Components: ppm; Source: "namazu\ppm\600\x86\*.*"; DestDir: "{app}\ppm\600\x86";
Components: ppm; Source: "namazu\ppm\600\*.*"; DestDir: "{app}\ppm\600";
Components: ppm; Source: "namazu\ppm\500\x86\*.*"; DestDir: "{app}\ppm\500\x86";
Components: ppm; Source: "namazu\ppm\500\*.*"; DestDir: "{app}\ppm\500";
Components: ppm; Source: "namazu\ppm\*.*"; DestDir: "{app}\ppm";
Components: dll; Source: "namazu\lib\*.*"; DestDir: "{app}\lib";
Components: dll; Source: "namazu\include\namazu\*.*"; DestDir: "{app}\include\namazu";
Components: test; Source: "namazu\tests\*.*"; DestDir: "{app}\tests";
Components: test; Source: "namazu\tests\data\dup-field\*.*"; DestDir: "{app}\tests\data\dup-field";
Components: test; Source: "namazu\tests\data\emphasize\*.*"; DestDir: "{app}\tests\data\emphasize";
Components: test; Source: "namazu\tests\data\en\*.*"; DestDir: "{app}\tests\data\en";Components: test; Source: "namazu\tests\data\filter\*.*"; DestDir: "{app}\tests\data\filter";Components: test; Source: "namazu\tests\data\html-split\*.*"; DestDir: "{app}\tests\data\html-split";
Components: test; Source: "namazu\tests\data\ja\*.*"; DestDir: "{app}\tests\data\ja";Components: test; Source: "namazu\tests\data\ja-spec\*.*"; DestDir: "{app}\tests\data\ja-spec";
Components: test; Source: "namazu\tests\data\query\*.*"; DestDir: "{app}\tests\data\query";[Types]Name: "All";
Description: "{cm:NMZ_TypeAll}";
Name: "Compact"; Description: "{cm:NMZ_TypeCompact}";
Name: "Custom"; Description: "{cm:NMZ_TypeCustom}"; Flags: iscustom;[Components]
Name: main; Description: "{cm:NMZ_ComponentMAIN}"; Types: All Custom Compact; Flags: fixed;
Name: ppm; Description: "{cm:NMZ_ComponentPPM}"; Types: All Custom Compact;
Name: dll; Description: "{cm:NMZ_ComponentDLL}"; Types: All Custom;
Name: ole; Description: "{cm:NMZ_ComponentOLE}"; Types: All Custom;
Name: test; Description: "{cm:NMZ_ComponentTEST}"; Types: All Custom;※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

19

.iss ファイル（ Taks, Icons, Run, Uninstall… ）[Tasks]Components: main; Name: "SetEnv";
Description: "{cm:NMZ_TaskSetEnv}"; MinVersion: 4.9,4;
Components: main; Name: "SetEnv\Locale"; Description: "{cm:NMZ_TaskLocale}"; MinVersion: 4.9,4;
Components: main; Name: "SetEnv\Kakasi"; Description: "{cm:NMZ_TaskKakasi}"; MinVersion: 4.9,4;
Components: main; Name: "SetEnv\Namazu"; Description: "{cm:NMZ_TaskNamazu}"; MinVersion: 4.9,4;
Components: main; Name: "SetEnv\AddPath"; Description: "{cm:NMZ_TaskPath}"; MinVersion: 4.9,4;
Components: ppm; Name: "PPMinstall";Description: "{cm:NMZ_TaskPPMinstall}";[Icons]Languages: en; Name: "{group}\README(English)";Filename: "{app}\README-en.txt";
Languages: en; Name: "{group}\Namazu User's Manual";
Filename: "{app}\share\namazu\doc\en\manual.html";
Languages: ja; Name: "{group}\ はじめにお読みください ";Filename: "{app}\README-ja.txt";
Languages: ja; Name: "{group}\ 全文検索システム Namazu 説明書 "; Filename: "{app}\share\namazu\doc\ja\manual.html";
Name: "{group}\{cm:UninstallProgram,Namazu for Win32}";
Filename: "{uninstallexe}";[Run]
Tasks: "PPMinstall"; Filename: "{app}\ppm\PPM-INSTALL.BAT"; Parameters: "";Languages: en; Filename: "{app}\README-en.txt"; Flags: postinstall shellexec skipifsilent;
Languages: ja; Filename: "{app}\README-ja.txt"; Flags: postinstall shellexec skipifsilent;[UninstallRun][UninstallDelete]
Components: test; Type: filesandordirs; Name: "{app}\tests"※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

20

.iss ファイル（英語 CustomMessages ）[CustomMessages]en.NMZ_TypeAll=Full installationen.NMZ_TypeCompact=Compact installationen.NMZ_TypeCustom=Custom installationen.NMZ_ComponentMAIN=Main applications and documents
en.NMZ_ComponentPPM=Perl modules (ActivePerl PPM binary package)en.NMZ_ComponentOLE=Win32 OLE document filters (Word, Excel, PowerPoint)
en.NMZ_ComponentDLL=Developers libraries (include, lib, DLL)
en.NMZ_ComponentTEST=test datas and test scripts (test suites)
en.NMZ_ComponentCGI=namazu.cgi.exe
en.NMZ_TaskSetEnv=Set up the environment variables
en.NMZ_TaskLocale=Select locale
en.NMZ_TaskKakasi=Find the Japanese dictionaries of Kakasi
en.NMZ_TaskNamazu=Select the config files of Namazu
en.NMZ_TaskPath=Add Path
en.NMZ_TaskPPMinstall=Install the Perl modules for mknmz
en.NMZ_LocalePageCaption=Locale
en.NMZ_LocalePageSubCaption1=Please specify the value of an environment variable LANG.
en.NMZ_LocalePageSubCaption2=Please click Next, when you do not matter with this.
en.NMZ_KakasiHomePageCaption=Kakasi's directoryen.NMZ_KakasiHomePageSubCaption1=Please specify the folder in which Kakasi is already installed.
en.NMZ_KakasiHomePageSubCaption2=When Kakasi is not installed, please click Next as it is.
en.NMZ_KakasiDictPageCaption=Kakasi's dictionary fileen.NMZ_KakasiDictPageSubCaption1=Please specify the path with which the dictionary file (kanwadict, itaijidict) of Kakasi is installed.
en.NMZ_KakasiDictPageSubCaption2=When Kakasi is not installed, please click Next as it is.
en.NMZ_KakasiHomeNotExsist=Specified folder "%s" %nKakasi is not installed.%n%nDo you wish to continue?
en.NMZ_KakasiDictNotExsist=Specified path "%s" %nThe dictionary file of Kakasi does not exist.%n%nDo you wish to continue?
en.NMZ_WizardDirValueCannotContainSpace=A space cannot be included in the folder name of installation.%n%n"%s"en.NMZ_NamazuSharePageCaption=Namazu folder
en.NMZ_NamazuSharePageSubCaption1=Please specify the values of Environment variables at "NAMAZULOCALEDIR" and "pkgdatadir".
en.NMZ_NamazuSharePageSubCaption2=Usually, it is better. Please click Next then.
en.NMZ_NamazuConfigPageCaption=Namazu config files
en.NMZ_NamazuConfigPageSubCaption1=Please specify the values of Environment variables at "MKNMZRC" and "NAMAZURC".
en.NMZ_NamazuConfigPageSubCaption2=Usually, it is better. Please click Next then.
en.NMZ_AddPathPageCaption=Add to PATH
en.NMZ_AddPathPageSubCaption1=Please specify the folder added to PATH.
en.NMZ_AddPathPageSubCaption2=Usually, it is better. Please click Next then.
en.NMZ_EnvPromptAddPath=folder added to PATH
en.NMZ_EnvPromptKANWADICTPATH=KANWADICTPATH
en.NMZ_EnvPromptITAIJIDICTPATH=ITAIJIDICTPATH
en.NMZ_EnvPromptLANG=LANG
en.NMZ_EnvPromptNAMAZULOCALEDIR=NAMAZULOCALEDIR
en.NMZ_EnvPromptPKGDATADIR=pkgdatadiren.NMZ_EnvPromptMKNMZRC=MKNMZRC
en.NMZ_EnvPromptNAMAZURC=NAMAZURC
en.NMZ_EnvironmentVariables=Environment Variables※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

21

.iss ファイル（日本語 CustomMessages ）ja.NMZ_TypeAll= 全てインストール
ja.NMZ_TypeCompact= 最小インストール
ja.NMZ_TypeCustom= カスタムインストール
ja.NMZ_ComponentMAIN= アプリケーションとドキュメント
ja.NMZ_ComponentPPM=Perl モジュール (ActivePerl PPM バイナリ )ja.NMZ_ComponentOLE= 開発者向けライブラリ (include, lib, DLL)
ja.NMZ_ComponentDLL=Win32 OLE 文書フィルタ (Word, Excel, PowerPoint)
ja.NMZ_ComponentTEST= テストデータとテストスクリプト (test suites)
ja.NMZ_ComponentCGI=namazu.cgi.exe
ja.NMZ_TaskSetEnv=Namazu for Win32 の動作に必要な環境変数を設定する
ja.NMZ_TaskLocale= ロケールの設定
ja.NMZ_TaskKakasi=Kakasi の辞書ファイル
ja.NMZ_TaskNamazu=Namazu の設定ファイル
ja.NMZ_TaskPath=PATH の追加 ( 既に設定されている場合は追加されません )ja.NMZ_TaskPPMinstall=PPM-INSTALL.BAT の実行 (ActivePerl へのインストール )ja.NMZ_LocalePageCaption= ロケールの設定
ja.NMZ_LocalePageSubCaption1= 環境変数 LANG の値を指定してください。
ja.NMZ_LocalePageSubCaption2= 日本語の文書を取り扱う場合は、そのまま「次へ」をクリックしてください。
ja.NMZ_KakasiHomePageCaption=Kakasi の検索
ja.NMZ_KakasiHomePageSubCaption1=Kakasi がインストールされているフォルダを指定してください。
ja.NMZ_KakasiHomePageSubCaption2=Kakasi がインストールされていない場合は、そのまま「次へ」をクリックし、後からこのフォルダに Kakasi for Win32 をインストールしてください。
ja.NMZ_KakasiDictPageCaption=Kakasi の辞書ファイル
ja.NMZ_KakasiDictPageSubCaption1=Kakasi の辞書ファイル (kanwadict,itaijidict) がインストールされているパスを指定してください。
ja.NMZ_KakasiDictPageSubCaption2= 通常はこのままで構いません。「次へ」をクリックしてください。
ja.NMZ_KakasiHomeNotExsist= 指定されたフォルダには %nKakasi がインストールされていません。 %n%n このまま続行してもよろしいでしょうか ?%n%n"%s"
ja.NMZ_KakasiDictNotExsist= 指定されたパスには %nKakasi の辞書ファイルが存在しません。 %n%n このまま続行してもよろしいでしょうか ?%n%n"%s"
ja.NMZ_WizardDirValueCannotContainSpace= インストール先のフォルダ名に %n 半角スペースを含むことはできません。 %n%n"%s"
ja.NMZ_NamazuSharePageCaption=Namazu の参照するフォルダ
ja.NMZ_NamazuSharePageSubCaption1= 環境変数 NAMAZULOCALEDIR と pkgdatadir の値を指定してください。
ja.NMZ_NamazuSharePageSubCaption2= メッセージカタログの存在するフォルダ (NAMAZULOCALEDIR) と、 Namazu の文書フィルタなどが存在するフォルダ (pkgdatadir) を指定します。
通常はこのままで構いません。「次へ」をクリックしてください。
ja.NMZ_NamazuConfigPageCaption=Namazu の設定ファイル
ja.NMZ_NamazuConfigPageSubCaption1= 環境変数 MKNMZRC と NAMAZURC の値を指定してください。
ja.NMZ_NamazuConfigPageSubCaption2=mknmz スクリプトと namazu コマンドが読み込む設定ファイルの場所を指定します。通常はこのままで構いません。「次へ」をクリックしてください。
ja.NMZ_AddPathPageCaption=PATH の追加
ja.NMZ_AddPathPageSubCaption1= 環境変数 PATH に追加するフォルダを指定してください。
ja.NMZ_AddPathPageSubCaption2= 既にこのフォルダがパスに登録されている場合は追加されません。通常はこのままで構いません。「次へ」をクリックしてください。
ja.NMZ_EnvPromptAddPath= 追加するフォルダ
ja.NMZ_EnvPromptKANWADICTPATH= 環境変数 KANWADICTPATH
ja.NMZ_EnvPromptITAIJIDICTPATH= 環境変数 ITAIJIDICTPATH
ja.NMZ_EnvPromptLANG= 環境変数 LANG
ja.NMZ_EnvPromptNAMAZULOCALEDIR= 環境変数 NAMAZULOCALEDIR
ja.NMZ_EnvPromptPKGDATADIR= 環境変数 pkgdatadir
ja.NMZ_EnvPromptMKNMZRC= 環境変数 MKNMZRC
ja.NMZ_EnvPromptNAMAZURC= 環境変数 NAMAZURC
ja.NMZ_EnvironmentVariables= 環境変数
※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

22

.iss ファイル（ Code セクション）[Code]
function SendMessageTimeoutA(hWnd, msg, wParam: Longint; lParam: String; fuFlags, uTimeout: Longint; lpdwResult: Longint): Longint;
external 'SendMessageTimeoutA@user32.dll stdcall';procedure SynchronizeEnvironment();
var
updateRes: Longint;
begin{ SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, 0) }updateRes := SendMessageTimeoutA($FFFF, $1A, 0, 'Environment', $2, 5000, 0);end;function PutEnv(EnvKey, EnvValue: String): Boolean;begin
if InstallOnThisVersion('4.9,0', '0,0') = irInstall then begin{ Windows Me only }Result := RegWriteStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\SessionManager\Environment', EnvKey, EnvValue);end else if InstallOnThisVersion('0,4', '0,0') = irInstall then begin{ Windows NT 4.0 / 2000 / XP / Server 2003 ... }Result := RegWriteStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', EnvKey, EnvValue);end else begin{ Windows 95 / 98 / 98SE }
;
end;
end;

※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

23

.iss ファイル（ Code 続き… 2 ）function InitializeSetup(): Boolean;
begin{ Initialized }LocaleInitialized := False;
KakasiHomeInitialized := False;
KakasiDictInitialized := False;
NamazuShareInitialized := False;
NamazuConfigInitialized := False;
AddPathInitialized := False;{ Locale }ENV_LANG := GetEnv('LANG');{ Kakasi }SetArrayLength(ENV_KakasiDictPrompts, 2);
ENV_KakasiDictPrompts[0] := ExpandConstant('{cm:NMZ_EnvPromptKANWADICTPATH}');
ENV_KakasiDictPrompts[1] := ExpandConstant('{cm:NMZ_EnvPromptITAIJIDICTPATH}');
SetArrayLength(ENV_KakasiDictValues, 2);
ENV_KakasiDictValues[0] := GetEnv('KANWADICTPATH');
ENV_KakasiDictValues[1] := GetEnv('ITAIJIDICTPATH');{ Namazu Config }SetArrayLength(ENV_NamazuConfigPrompts, 2);
ENV_NamazuConfigPrompts[0] := ExpandConstant('{cm:NMZ_EnvPromptMKNMZRC}');
ENV_NamazuConfigPrompts[1] := ExpandConstant('{cm:NMZ_EnvPromptNAMAZURC}');
SetArrayLength(ENV_NamazuConfigValues, 2);
ENV_NamazuConfigValues[0] := GetEnv('NAMAZURC');
ENV_NamazuConfigValues[1] := GetEnv('MKNMZRC');{ Namazu Share }SetArrayLength(ENV_NamazuSharePrompts, 2);
ENV_NamazuSharePrompts[0] := ExpandConstant('{cm:NMZ_EnvPromptNAMAZULOCALEDIR}');
ENV_NamazuSharePrompts[1] := ExpandConstant('{cm:NMZ_EnvPromptPKGDATADIR}');
SetArrayLength(ENV_NamazuShareValues, 2);
ENV_NamazuShareValues[0] := GetEnv('NAMAZULOCALEDIR');
ENV_NamazuShareValues[1] := GetEnv('pkgdatadir');{ Path }ENV_AddPath := '';{ Let Setup run }Result := True;end;※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

24

.iss ファイル（ Code 続き… 3 ）function SelectedTask(Task: String): Boolean;
begin
Result := Pos(',' + Lowercase(Task) + ',', ',' + Lowercase(WizardSelectedTasks(False)) + ',') > 0;end;function CustomDlgPages(BackClicked: Boolean): Boolean;
var
CurSubPage, CurSubPageMax: Integer;
Next, Retry: Boolean;
begin
CurSubPageMax := 5;
if not BackClicked then
CurSubPage := 0
else
CurSubPage := CurSubPageMax;
Next := not BackClicked;
while (CurSubPage >= 0) and (CurSubPage <= CurSubPageMax) and not Terminated do begin
Retry := False;
case CurSubPage of0:
begin
if SelectedTask('SetEnv\Locale') then begin
if not LocaleInitialized then begin
if ENV_LANG = '' then
ENV_LANG := 'ja_JP.SJIS';
LocaleInitialized := True;
end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_LocalePageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_LocalePageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_LocalePageSubCaption2}'));
Next := InputQuery(ExpandConstant('{cm:NMZ_EnvPromptLANG}'), ENV_LANG);
end else begin
LocaleInitialized := False;
end;
end;

※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

25

.iss ファイル（ Code 続き… 4 ）
1:

begin
if SelectedTask('SetEnv\Kakasi') and ((ENV_KakasiDictValues[0] = '') or (ENV_KakasiDictValues[1] = '')) then begin
if not KakasiHomeInitialized then begin
ENV_KakasiHome := ExpandConstant('{sd}\kakasi');KakasiHomeInitialized := True;
end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_KakasiHomePageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_KakasiHomePageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_KakasiHomePageSubCaption2}'));
Next := InputDir(True, '', ENV_KakasiHome);
if (Next) and (not Retry) and (not DirExists(ENV_KakasiHome)) then begin
Retry := IDNO = MsgBox(Format1(ExpandConstant('{cm:NMZ_KakasiHomeNotExsist}'), ENV_KakasiHome), mbConfirmation, MB_YESNO);
end;
end else begin
KakasiHomeInitialized := False;
end;
end;
2:
begin
if SelectedTask('SetEnv\Kakasi') then begin
if not KakasiDictInitialized then begin
if ENV_KakasiDictValues[0] = '' then
ENV_KakasiDictValues[0] := ENV_KakasiHome + '\share\kakasi\kanwadict';
if ENV_KakasiDictValues[1] = '' then
ENV_KakasiDictValues[1] := ENV_KakasiHome + '\share\kakasi\itaijidict';end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_KakasiDictPageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_KakasiDictPageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_KakasiDictPageSubCaption2}'));
Next := InputQueryArray(ENV_KakasiDictPrompts, ENV_KakasiDictValues);
if (Next) and (not FileExists(ENV_KakasiDictValues[0])) then begin
Retry := IDNO = MsgBox(Format1(ExpandConstant('{cm:NMZ_KakasiDictNotExsist}'), ENV_KakasiDictValues[0]), mbConfirmation, MB_YESNO);end;
if (Next) and (not Retry) and (not FileExists(ENV_KakasiDictValues[1])) then begin
Retry := IDNO = MsgBox(Format1(ExpandConstant('{cm:NMZ_KakasiDictNotExsist}'), ENV_KakasiDictValues[1]), mbConfirmation, MB_YESNO);end;
if (Next) and (not Retry) then begin
KakasiDictInitialized := True;end;
end else begin
KakasiDictInitialized := False;
end;
end;
※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

26

.iss ファイル（ Code 続き… 5 ）
3:

begin
if SelectedTask('SetEnv\Namazu') then begin
if not NamazuConfigInitialized then begin
ENV_NamazuConfigValues[0] := ExpandConstant('{app}\etc\namazu\mknmzrc');
ENV_NamazuConfigValues[1] := ExpandConstant('{app}\etc\namazu\namazurc');
NamazuConfigInitialized := True;
end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_NamazuConfigPageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_NamazuConfigPageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_NamazuConfigPageSubCaption2}'));
Next := InputQueryArray(ENV_NamazuConfigPrompts, ENV_NamazuConfigValues);
end else begin
NamazuConfigInitialized := False;
end;
end;
4:
begin
if SelectedTask('SetEnv\Namazu') then begin
if not NamazuShareInitialized then begin
ENV_NamazuShareValues[0] := ExpandConstant('{app}\share\locale');ENV_NamazuShareValues[1] := ExpandConstant('{app}\share\namazu');
NamazuShareInitialized := True;
end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_NamazuSharePageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_NamazuSharePageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_NamazuSharePageSubCaption2}'));
Next := InputQueryArray(ENV_NamazuSharePrompts, ENV_NamazuShareValues);
end else begin
NamazuShareInitialized := False;
end;
end;
5:
begin
if SelectedTask('SetEnv\AddPath') then begin
if not AddPathInitialized then begin
ENV_AddPath := ExpandConstant('{app}\bin');
AddPathInitialized := True;
end;
ScriptDlgPageSetCaption(ExpandConstant('{cm:NMZ_AddPathPageCaption}'));
ScriptDlgPageSetSubCaption1(ExpandConstant('{cm:NMZ_AddPathPageSubCaption1}'));
ScriptDlgPageSetSubCaption2(ExpandConstant('{cm:NMZ_AddPathPageSubCaption2}'));
Next := InputQuery(ExpandConstant('{cm:NMZ_EnvPromptAddPath}'), ENV_AddPath);
end else begin
AddPathInitialized := False;
end;
end;
end;
if Next then begin
if not Retry then
CurSubPage := CurSubPage + 1;
end else
CurSubPage := CurSubPage - 1;
end;
Result := Next;end;※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

27

.iss ファイル（ Code 続き… 6 ）function ScriptDlgPages(CurPage: Integer; BackClicked: Boolean): Boolean;var
Next: Boolean;begin
if (not BackClicked and (CurPage = wpSelectDir)) then begin{ check WizardDirValue }if Pos(' ', WizardDirValue) > 0 then begin
MsgBox(Format1(ExpandConstant('{cm:NMZ_WizardDirValueCannotContainSpace}'), WizardDirValue), mbError, MB_OK);
Result := False;end else begin
Result := True;end;
end else if (not BackClicked and (CurPage = wpSelectTasks)) or (BackClicked and (CurPage = wpReady)) then begin{ custom pages }ScriptDlgPageOpen();
ScriptDlgPageShowBackButton(True);
Next := CustomDlgPages(BackClicked);
if not BackClicked then
Result := Next
else
Result := not Next;
if not Terminated thenScriptDlgPageClose(not Result);
end else begin{ skip }Result := True;
end;
end;
procedure InstallFinishedScript();
var
TMP_PATH: String;begin
if (SelectedTask('SetEnv')) or (SelectedTask('SetEnv\AddPath')) then begin
if InstallOnThisVersion('4.9,4', '0,0') = irInstall then begin
if SelectedTask('SetEnv\Locale') then begin
PutEnv('LANG', ENV_LANG);
end;
if SelectedTask('SetEnv\KaKasi') then begin
PutEnv('KANWADICTPATH', ENV_KakasiDictValues[0]);PutEnv('ITAIJIDICTPATH', ENV_KakasiDictValues[1]);end;
if SelectedTask('SetEnv\Namazu') then begin
PutEnv('MKNMZRC', ENV_NamazuConfigValues[0]);PutEnv('NAMAZURC', ENV_NamazuConfigValues[1]);PutEnv('NAMAZULOCALEDIR', ENV_NamazuShareValues[0]);PutEnv('pkgdatadir', ENV_NamazuShareValues[1]);end;
if SelectedTask('SetEnv\AddPath') then begin
TMP_PATH := GetEnv('PATH');if (Pos(Uppercase(ENV_AddPath), Uppercase(TMP_PATH)) = 0) then begin
PutEnv('PATH', ENV_AddPath + ';' + TMP_PATH);
end;
end;
SynchronizeEnvironment();
end else begin
MsgBox('[Win9x] Cannot set environment variables.', mbError, MB_OK);
end;
end;
end;

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks※ 画面は開発途中（ β 版）のものです28.iss ファイル（ Code 続き… 7 ）procedure CurPageChanged(CurPage: Integer);begin
if CurPage = wpFinished then begin
InstallFinishedScript();
end;
end;
function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := ScriptDlgPages(CurPage, False);end;function BackButtonClick(CurPage: Integer): Boolean;
begin
Result := ScriptDlgPages(CurPage, True);
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;var
S: String;begin
S := '';
if MemoUserInfoInfo <> '' thenS := S + MemoUserInfoInfo + NewLine + NewLine;
if MemoDirInfo <> '' thenS := S + MemoDirInfo + NewLine + NewLine;
if MemoTypeInfo <> '' thenS := S + MemoTypeInfo + NewLine + NewLine;
if MemoComponentsInfo <> '' thenS := S + MemoComponentsInfo + NewLine + NewLine;
if MemoGroupInfo <> '' thenS := S + MemoGroupInfo + NewLine + NewLine;
if MemoTasksInfo <> '' thenS := S + MemoTasksInfo + NewLine + NewLine;{ Custom add }if SelectedTask('SetEnv') then begin
S := S + ExpandConstant('{cm:NMZ_EnvironmentVariables}') + ':' + NewLine;
if SelectedTask('SetEnv\Locale') then begin
S := S + Space + 'LANG=' + ENV_LANG + NewLine;end;
if SelectedTask('SetEnv\KaKasi') then begin
S := S + Space + 'KANWADICTPATH=' + ENV_KakasiDictValues[0] + NewLine;S := S + Space + 'ITAIJIDICTPATH=' + ENV_KakasiDictValues[1] + NewLine;end;
if SelectedTask('SetEnv\Namazu') then begin
S := S + Space + 'MKNMZRC=' + ENV_NamazuConfigValues[0] + NewLine;S := S + Space + 'NAMAZURC=' + ENV_NamazuConfigValues[1] + NewLine;S := S + Space + 'NAMAZULOCALEDIR=' + ENV_NamazuShareValues[0] + NewLine;S := S + Space + 'pkgdatadir=' + ENV_NamazuShareValues[1] + NewLine;end;
S := S + NewLine;end;
if SelectedTask('SetEnv\AddPath') then begin
S := S + ExpandConstant('{cm:NMZ_AddPathPageCaption}') + ':' + NewLine;S := S + Space + ExpandConstant('{cm:NMZ_EnvPromptAddPath}=') + ENV_AddPath + NewLine;S := S + NewLine;
end;
Result := S;
end;※ 画面は開発途中（ β 版）のものです

2004-05-14

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

29

まとめ


Windows アプリを作って配布するときは…


インストーラ／アンインストーラを提供しましょう

Inno Setup を使えば、簡単にインストーラが作成できます.iss ファイルを GUI で編集するツールもいくつか公開されています

足りない機能は [Code] で補完ISTool, InnoEdit …

独自のウィザード画面の追加など・・・
Pascal Script で機能拡張（深追いパターン・バッドノウハウの蓄積）

オープンソースの開発に参加

2004-05-14

新しい機能について、動作報告・不具合報告を行う
機能追加・バグ修正のパッチを作成して送ってみる
出来上がった .iss ファイルを公開すると他の利用者に喜ばれるかも・・・
Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

30

参考 URL

Inno Setup （英語）jrsoftware.org // jordan russell's softwareInno Setup （日本語）Inno Setup, ISTool の日本語化（ mystral_kk さん）


http://www.geocities.jp/mystral_kk/

Inno Setup Japanese version （山下誠二さん）


http://www.jrsoftware.org/

http://www.syam.net/library/innosetupj/

Namazu Project

2004-05-14

http://www.namazu.org/

Shibuya.pm #05 - Bad Know-how Conference 2004 - Lightning Talks

31