最近,ちょっとしたアプリケーションのインストーラを書く機会が増えてきました.インストーラは Inno Setup で作成しているのですが,毎回,似たようなスクリプトファイルを記述するのは面倒になってきました(以前の Inno Setup 用 IDE であれば,IDE がテンプレートを自動生成してくれたのですが,これも微妙に修正する箇所があったりなかったり).そんな訳で,ある程度,汎用的に使っていけるテンプレート(スケルトン)用のスクリプトファイルを作成してみました.
ダウンロード
https://github.com/clown/inno-templates から.使い方は,README を読むと大体分かるかと思います.README の内容をここにも記述しておきます.
ファイル構成
inno-templates では,以下のようなファイル構成を想定しています.
{#ROOT_PATH} + setup - setup.iss - process.iss - windows.iss + {#RESOURCE_DIR} + x86 - {#APP_EXE_NAME}.exe + x64 - {#APP_EXE_NAME}.exe - Readme.txt - License.txt - {#APP_EXE_NAME}.ico - ...
アプリケーション本体は,x86/x64 両方のバージョンが存在するケースを想定して書かれていますので,どちらか一方のエディションしか用意しない場合でも,x86/x64 のフォルダを作成した上で,そのフォルダにアプリケーション本体を設置して下さい.尚,各種テキストファイル(Readme.txt, License.txt),およびアイコン画像ファイルは省略する事も可能です.詳細は,「パラメータ設定」の項目で記述します.
パラメータ設定
inno-templates では,以下のパラメータが設定されています.これらは,setup.iss の上部で定義されており,これらを変更する事によってインストーラが作成されます.
- X64_INSTALL_MODE
- 必須項目です.このパラメータを 0 にすると 32bit 用のインストーラが,1 以上に設定すると 64bit 用のインストーラが作成されます.尚,上記のファイル構成に関連した注意事項として,0 に設定すると x86 フォルダ以下のファイルを 1 以上に設定すると x64 フォルダ以下のファイルを参照するようになります.
- GUID_VALUE
- 必須項目です.インストーラに固有の GUID を割り当てます.開発環境として InnoIDE を使用している場合,「Inno Scripts」→「Insert GUID」メニューを選択する事により新たな GUID を生成する事ができます.
- ROOT_PATH
- 必須項目です.各種スクリプトファイルやインストールするリソース群が置かれているフォルダのルートとなるパスを選択します.
- RESOURCE_DIR
- 必須項目です.アプリケーション本体や各種テキストファイル等のリソースが格納されているフォルダ名を指定します.初期値には "release" が指定されています.例えば,ROOT_PATH が "C:\myproject" であった場合,setup.iss は各種リソースファイル群が "C:\myproject\release\" 以下に存在すると想定します.
- APP_NAME
- 必須項目です.インストーラを作成するアプリケーションの名前を設定します.
- APP_EXE_NAME
- 必須項目です.メインとなるアプリケーションの exe 名を設定します.スクリプトファイル中では {#APP_EXE_NAME}.exe と記述しています.そのため,ここで設定するファイル名は ".exe" を除いた名前となります.
- APP_VERSION
- オプションです.アプリケーションのバージョンを設定します.省略する場合は,パラメータ自体は削除せずに "" を設定して下さい.
- APP_RELEASE_YEAR
- オプションです.アプリケーションのリリース年を設定します.スクリプトファイル内では現在のところ,コピーライト表記でのみ使用しています.
Copyright (c) {#APP_RELEASE_YEAR} {#APP_PUBLISHER}
省略する場合は,パラメータ自体は削除せずに "" を設定して下さい. - APP_PUBLISHER
- 必須項目です.アプリケーションの作成者の名前を設定します.
- APP_URL
- 必須項目です.アプリケーションの配布,または説明をしている Web ページの URL を指定します.
※APP_URL を指定しない場合,[Icons] セクションの Filename: {#APP_URL} となっている行を削除した後,パラメータ自体は削除せずに "" を設定して下さい. - APP_LICENSE
- オプションです.アプリケーションのライセンスが記述されているファイルのファイル名を設定します.スクリプトファイル内では,このファイルは {#ROOT_PATH}\{#RESOURCE_DIR} 下に存在している事を想定しています.このファイルに記述されている内容が,インストーラ実行時の「使用許諾契約書の同意」のダイアログで表示されます.ファイルが存在しない場合は,このパラメータを削除して下さい.
- APP_README
- オプションです.アプリケーションの説明が書かれているファイルのファイル名を設定します.スクリプトファイル内では,このファイルは {#ROOT_PATH}\{#RESOURCE_DIR} 下に存在している事を想定しています.ここで設定されたファイルが,インストーラの最後に「Readme.txt を表示する」と言った選択肢として表示されます.ファイルが存在しない場合は,このパラメータを削除して下さい.
- APP_ICON
- オプションです.アプリケーションのアイコンとして使用されている画像ファイルを設定します.ここで設定された画像がインストーラのアイコンとして使用されます.ファイルが存在しない場合は,このパラメータを削除して下さい.
setup.iss のデフォルトの挙動
ファイル関連
{#APP_EXE_NAME}.exe(アプリケーション本体),および {#APP_README}(説明用のテキストファイル)がインストールされます.APP_README パラメータを削除した場合は,アプリケーション本体のみがインストールされます.
レジストリ関連
HKEY_LOCAL_MACHINE\Software\{#APP_PUBLISHER}\{#APP_NAME} 下に以下の値が設定されます.
- InstallDirectory ..... ユーザが選択したインストールフォルダ
- Version ..... アプリケーションのバージョン(APP_VERSION で指定した値)
ショートカット関連
スタートメニュの「すべてのプログラム→{#APP_PUBLISHER}→{#APP_NAME}」下に以下のショートカットが設定されます.
- アプリケーション本体 ..... {#APP_EXE_NAME}.exe を実行するショートカット
- Web ページへのリンク ..... {#APP_URL} で指定した URL を規定のブラウザで開くショートカット
- アンインストール ..... アプリケーションをアンインストールするためのプログラムへのショートカット
また,これとは別にデスクトップにアプリケーション本体へのショートカットを作成するかどうかの
オプションをダイアログで表示するように設定されています.
その他
[Code] セクションにおいてもいくつかの機能をデフォルトで実装しています.
インストールするアプリケーションが実行されているかどうかのチェック
アプリケーションをアップデートする等の理由で,既にアプリケーションがインストールされているにも関わらず,再度インストーラを実行する場合があります.そういった場合に,インストーラ起動時にアプリケーション本体が実行されているとインストールに失敗します.また,アンインストール時に置いても同じような問題が発生します.そのため,インストーラ,およびアンインストーラの起動直後にアプリケーションが実行されているかどうかをチェックし,実行されている場合は強制終了する KillProc() 関数を実装しています.
尚,KillProc() 関数は,64bit 用であっても Inno Setup で生成されるインストーラプログラム自体は 32bit 版であるため 64bit 用の場合にはうまく機能しません(32bit プロセスは 64bit プロセスを見つけられない - Life like a clown 参照).64bit 版でこの機能を実現する場合,プロセスを終了させるためだけの 64bit プログラムを作成し,そのプログラムをインストーラに含める等の回避策を取る必要があります.
Microsoft .NET Framework ランタイムがインストールされているかどうかのチェック
Microsoft .NET Framework を用いて開発されたアプリケーションは,インストールされる環境にランタイムがインストールされてある必要があります.そのため,インストーラの起動直後にMicrosoft .NET Framework ランタイムがインストールされてあるかどうかをチェックし,インストールされていない場合にはエラーメッセージを表示する機能を実装しています.
尚,この機能はデフォルトではコメントアウトされています.必要な場合は,InitializeSetup() 関数内の該当箇所のコメントアウトを解除します.