InstallShieldでインストーラーを作り始めるための３つの入口

あまり個人でInstallShieldを使う人はいないでしょうから、InstallShieldはほとんどの場合、業務で使うことになるでしょう。InstallShieldはライセンス条件が厳しく、共用のマシンにインストールして何人かのメンバーで使い回すことができません。オンラインで利用状況が監視されているので、運用には気を付けましょう。
***
さて、InstallShieldで新規にプロジェクトを作ろうとするとプロジェクトの種類が多くて、最初は面食らうかもしれませんが、InstallShieldでは大きく分類して3種類の仕組みのうち1つを選択してインストーラーを作ることになります。その3つとは、

1. 基本のMSIプロジェクト  
2. Install Scriptプロジェクト  
3. Install Script MSIプロジェクト  

です。最初に選択したプロジェクトは、インストールする製品のライフサイクルを通して使い続けることになるので、どれを選択するかは重要な問題です。ここでは、どのようにプロジェクトの種類を選択すればよいか解説したいと思います。

まずは、教科書（ユーザーガイド）の
> スタートガイド
> 　┗ ニーズに合ったインストール プロジェクトを選択する

の項を読みましょう。でも、これを読んで一発でふさわしいプロジェクトを選択できる人はいないと思います。そこで、これまで私が使ってきて感じた、各プロジェクトの特徴を説明します。

# 基本のMSIプロジェクト
はっきり言って、上級者向けです。初心者が一から作り始める場合には、お勧めできません。少し複雑なことをしようとすると、Windowsが持つインストーラーの仕組みである、[Windows Installer](http://msdn.microsoft.com/en-us/library/cc185688(v=VS.85).aspx)の深い知識を要求されます。また、業務レベルのインストーラーを作成するなら、特別な機能を実装するためにC言語等でDLLを作成する必要があります。でも、

- Windows SDKでインストーラーを作成するよりは人間的な作業で作成ができる
- インストーラー向けに多言語に翻訳された文章が豊富に揃っている
- セットアップランチャーが用意されているので、インストーラーを構成するファイルを一つにまとめたり、1つのパッケージで多言語をサポートしたり、簡単にマイナーアップグレードのインストーラーを作成できる

など、多くのメリットがあるので、慣れた人には選択肢の1つになりえます。複数のフリーのツールを組み合わせれば、ほぼ同等の物を作れますが、多言語のインストーラーを要求されている場合は、翻訳がネックになるかもしれません。そういう意味でも、InstallShieldはプロのツールですね。

# Install Scriptプロジェクト
Install Scriptプロジェクトは歴史が古く、大昔に作られたインストーラーはこのプロジェクトが多いかもしれません。このプロジェクトでは、インストールウィザードのダイアログの表示の仕方を変えたり、特別なインストール処理を、Install Scriptと呼ばれるスクリプトで記述します。このプロジェクトでは、多くのイベントハンドラが用意されていて、すでにデフォルトの処理がスクリプトで用意されていますので、これを改造してカスタマイズしていきます。イベントハンドラによっては、初期状態では何も処理が無いものもあります。Install Scriptは非常に強力で、インストールに必要な機能はほぼ網羅されていますが、外部DLLの関数を呼ぶこともでき、Win32 APIを使うこともできます。
例えば、初回インストール時のUI表示で呼ばれるイベントハンドラは、「OnFirstUIBefor()」という関数ですが、これを編集するために呼び出すと、各ダイアログの表示関数や、ユーザーが各ボタンを押した時の処理などがスクリプトで書かれていることがわかります。このスクリプトを改造することで、UI処理の変更が可能になります。
このプロジェクトは、インストール時にWindowsInstallerの仕組みを使わないのですが、これが、メリットにもデメリットにもなります。WindowsInstallerの仕組みの上で動くインストーラーは、基本的にインストーラーからインストーラーを呼び出すことができません。このような複雑な構造を実現する場合、呼び出す側のインストーラーを作成するために、Install Scriptプロジェクトを使うことができます。しかし、WindowsInstaller向けのインストーラー用モジュールである「マージモジュール」を実質使うことができない（使えないことは無いが、気付きにくい大きな落とし穴がある）ので、例えばVCランタイムをインストールする際は、VCRedist.exeなど外部のプログラムを起動する必要があります。これは、大きなデメリットではありませんが、うまく制御しないと余計なウィンドウが出てきたり、見栄えを整えるのが面倒なこともあります。

# Install Script MSIプロジェクト
私は好んでこのプロジェクトを使用しています。WindowsInstallerの仕組みを使いつつ、Install Scriptプロジェクトと同様のスクリプトを使うことができます。ただ、Install Scriptプロジェクトで使えるイベントハンドラと微妙に異なる部分もあるので、そこは注意が必要です。
このプロジェクトは、名前の通り、Install Scriptプロジェクトと基本のMSIプロジェクトのハイブリッドで、両者の特徴をあわせ持っています。基本的にWindowsInstallerの仕組みの上で動作するインストーラーが作られますが、カスタマイズのためにInstall Scriptを使うことができます。WindowsInstallerの仕組みは使いたいけれど、カスタマイズのためにC言語でDLLを作りたくない時に重宝します。Install Scriptプロジェクトで使い物にならなかったマージモジュールも使えるし、扱いが簡単なスクリプトでカスタマイズできるので、私は好きです。
インストールウィザードの各ダイアログの表示は、Install Scriptが担っているので、UIの挙動をカスタマイズする場合も、Install Scriptを使います。気をつけなければならないのは、InstallShieldのIDE上ではWindowsInstallerの仕組みであるInstall UI Sequenseが編集できるようになっているので、ここでUIのカスタマイズができると勘違いしそうですが、ここを編集してもUIは何も変わらない、ということです。

***
InstallShieldは良いものなのに、使い込んで来ると、

- 値段が高すぎる
- ライセンスの縛りが厳しすぎる
- サポート期間が短く、プロジェクトを新バージョンに移行する手間があるのに、プロジェクトの変換がうまくできない部分がある

といった残念な部分が目立ってきます。結局、値段やライセンスのせいで、一人にインストーラー作成から保守まで集中していまい、技術の伝承も簡単には進みません。最近は、最初に少し苦労してもインストーラー作成はフリーのツールを使ったほうが、最終的にはInstallShieldよりもコスト（主に人件費）メリットが出てくるのではないかと思っています。