パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
Inno Setup

インストーラ作成ツールとして導入されるInno Setupを説明する。

Inno Setupによるインストーラの作成

ウィンドウズデスクトップアプリケーションDesktop1のインストーラを作成するとして通常の手順を説明する。

  • インストール対象とするファイル(実行形式ファイル、ヘルプファイル、翻訳ファイル)を作成する。
  • エディタ機能を持つデスクトップアプリケーションInno Setup Compiler(Compil32.exe)でスクリプトファイルを作成する。
  • Inno Setup Compilerでインストーラをコンパイル(作成)する。

スクリプトファイルは任意のテキストエディタでも編集できるし、コマンドラインツール(ISCC.exe)でコンパイルもできる。

スクリプトファイル

本サイトの用いるスクリプトファイルを示す。

InnoSetup.iss

; Script initially generated by the Inno Setup Script Wizard, modified by Takeshi Kodama.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
; 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.)
#define MyAppId "{{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
#define MyAppName "Desktop1"
#define MyAppVersion "0.0.0.0"
#define MyAppPublisher "KodamaDeveloped"
;#define MyAppURL "http://www.example.com/"
#define MyAppExeName MyAppName+".exe"
#define MyAppCopyright "(C) 2019 Takeshi Kodama"
#define MyDir "..\bin\"
#define MyAppExePath32 MyDir+"Release32\"+MyAppExeName
#define MyAppExePath64 MyDir+"Release64\"+MyAppExeName
#define MyAppChmPath MyDir+MyAppName+".chm"
#define MyAppLangPattern MyDir+"*"
#define MyAppMoPath(lang) MyDir+lang+"\"+MyAppName+".mo"
[Setup]
AppId={#MyAppId}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
;AppPublisherURL={#MyAppURL}
;AppSupportURL={#MyAppURL}
;AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppPublisher}\{#MyAppName}
DefaultGroupName={#MyAppPublisher}
OutputDir=.
OutputBaseFilename={#MyAppName}-{#MyAppVersion}
Compression=lzma
SolidCompression=yes
AppCopyright={#MyAppCopyright}
VersionInfoVersion={#MyAppVersion}
DisableWelcomePage=False
ArchitecturesInstallIn64BitMode=x64
UninstallDisplayIcon={app}\{#MyAppExeName}
WizardStyle=modern
#if !FileExists(MyAppExePath32)
ArchitecturesAllowed=x64
#endif
[Languages]
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
[Files]
#if FileExists(MyAppExePath32)
#if FileExists(MyAppExePath64)
Source: "{#MyAppExePath32}"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode
Source: "{#MyAppExePath64}"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode
#else
Source: "{#MyAppExePath32}"; DestDir: "{app}"; Flags: ignoreversion
#endif
#else
#if FileExists(MyAppExePath64)
Source: "{#MyAppExePath64}"; DestDir: "{app}"; Flags: ignoreversion
#else
#error No execution files are found
#endif
#endif
#if FileExists(MyAppChmPath)
Source: "{#MyAppChmPath}"; DestDir: "{app}"; Flags: ignoreversion
#endif
#sub FindPoFileProc
#define MyLang FindGetFileName(MyFindHandle)
#if !(SameText(MyLang,".")||SameText(MyLang,".."))&&FileExists(MyAppMoPath(MyLang))
Source: "{#MyAppMoPath(MyLang)}"; DestDir: "{app}\{#MyLang}"; Flags: ignoreversion
#endif
#undef MyLang
#endsub
#define MyFindHandle FindFirst(MyAppLangPattern,faDirectory)
#define MyFindResult
#for {MyFindResult=MyFindHandle;MyFindResult;MyFindResult=FindNext(MyFindHandle)} FindPoFileProc
#if MyFindHandle
#expr FindClose(MyFindHandle)
#endif
#undef MyFindResult
#undef MyFindHandle
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Registry]
Root: "HKA"; Subkey: "Software\{#MyAppPublisher}"; Flags: uninsdeletekeyifempty
Root: "HKA"; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}"; Flags: uninsdeletekey

このスクリプトファイルでカスタマイズが必要なプリプロセッサ変数を示す。最も重要な変数は[Setup]セクションAppIdディレクティブに代入されるMyAppIdで、ウィンドウズはこれでインストールされているアプリケーションを識別するため、全ての稼働環境でユニークである事が要求される。最も確実にはInno Setup Compilerで[Tools|Generate GUID]を実行しGUID文字列を生成するが、スクリプト記述において{app}などの定数と区別するため開き波括弧"{"を二重とする必要がある。あなたは最低でもこのMyAppIdを書き換える必要があるが、他の変数も真のアプリケーション名やあなたの名前で書き換えるはずだ。

変数 内容 初期値 備考
MyAppId アプリケーション識別子 "{{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" ユニークな文字列
MyAppName アプリケーション名 "Desktop1"
MyAppVersion アプリケーションバージョン "0.0.0.0"
MyAppPublisher アプリケーション発行元 "KodamaDeveloped"
MyAppURL アプリケーションウェブページ "http://www.example.com/" 今のところコメントアウト
MyAppExeName アプリケーション実行形式名 MyAppName+".exe"
MyAppCopyright アプリケーション著作権 "(C) 2019 Takeshi Kodama"

このスクリプトファイルはインストール対象ファイルが正しく配置されている事を前提に、32ビット/64ビット実行形式ファイルの有無により以下いずれかのインストーラを作成する。どちらの実行形式ファイルもない場合はインストーラ作成に失敗する。

インストーラ 32ビット 64ビット ターゲットアーキテクチャ インストール
32ビット/64ビット両対応 64ビット(x64) 64ビット実行形式
x64以外 32ビット実行形式
32ビット専用 64ビット(x64) 32ビット実行形式
x64以外 32ビット実行形式
64ビット専用 64ビット(x64) 64ビット実行形式
x64以外 失敗

その他のカスタマイズは対応セクションで定義される。

セクション カスタマイズ 初期値
[Icons] スタートメニュー登録 MyAppPublisherグループに登録
[Run] インストール直後の実行アプリケーション MyAppExeNameを実行
[Registry] レジストリ作成 HKEY_LOCAL_MACHINEに空キーを作成

アプリケーションが保存するであろうレジストリデータをアンインストール時に自動削除するためレジストリ空キーを作成する。RootパラメータHKAはインストール権限に依存してHKLM(HKEY_LOCAL_MACHINE)あるいはHKCU(HKEY_CURRENT_USER)に切り替えられるが、デフォルトはアドミニストレータ権限なのでHKLMとなる。アドミニストレータ権限インストールでアンインストール時にHKCUを自動削除するにはRootパラメータをHKCUとするが、複数アカウントを持つパソコンで問題となる場合があり推奨されない。

バッチファイル

以下にスクリプトファイルからコマンドラインツールによりインストーラを生成するバッチファイルを示す。

k_innosetup.bat

"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" InnoSetup.iss

インストール対象ファイルの配置

開発時にインストール対象ファイル(実行形式ファイル、HTMLヘルプファイル、バイナリ形式翻訳ファイル)は以下に配置されているものとする。Inno Setup実行バッチファイルによりインストーラDesktop1-0.0.0.0.exeが作成される。

ディレクトリ ファイル 内容
[プロジェクトディレクトリ] Desktop1.cbp Code::Blocksプロジェクト
*.cpp, *.h ソースコード、インクルード
resource.rc ウィンドウズリソース
├ bin Desktop1.chm HTMLヘルプ
│├ Debug32 Desktop1.exe 32ビット実行形式デバッグ版
│├ Release32 Desktop1.exe 32ビット実行形式リリース版
│├ Debug64 Desktop1.exe 64ビット実行形式デバッグ版
│├ Release64 Desktop1.exe 64ビット実行形式リリース版
│└ ja Desktop1.mo 日本語バイナリ形式翻訳
├ obj
│├ Debug32 *.o 32ビットオブジェクトデバッグ版
│├ Release32 *.o 32ビットオブジェクトリリース版
│├ Debug64 *.o 64ビットオブジェクトデバッグ版
│└ Release64 *.o 64ビットオブジェクトリリース版
├ wxsmith *.wxs wxSmithリソース
└ innosetup InnoSetup.iss Inno Setupスクリプト
Desktop1-0.0.0.0.exe インストーラ
k_innosetup.bat Inno Setup実行バッチ

配布時にインストーラは以下に配置する。

ディレクトリ ファイル 内容
[インストールディレクトリ] Desktop1.exe 実行形式
Desktop1.chm HTMLヘルプ
└ ja Desktop1.mo 日本語バイナリ形式翻訳