カスタムアクションの種類
はじめに、どのような機能をどのような手段で実現できるのか、紹介していきます。
DLL
DLLの関数をカスタムアクションとして呼び出すことができますが、独特のルールに沿って実装する必要があります。関数の引数と戻り値は自由に使うことができないため、プロパティ経由で情報の入出力を行います。こういった制限のため、カスタムアクション専用のDLLを作成することになります。
DLLを使ったカスタムアクションは、C言語でWin32 APIを使った実装を行うのが一般的だと思いますが、C#等で記述する例もあるようです。しかし、C言語で記述すればVisual C Runtimeライブラリや.NETライブラリに依存しないコードが書けますし、プログラムサイズを抑えることもできます。インストーラーはどのような環境でも動くことが求められることが多く、またプログラムサイズが小さければダウンロード時間が短くなるユーザーメリットもあります。
何を使ってDLLを書くかは、どのような環境でインストーラを使う想定なのか、によって変わってくるのだと思います。より多くの環境でトラブルなく使ってもらうには、ライブラリに頼ったDLLを使うべきではありません。依存するライブラリが予期せず消えてしまえば、アンインストールもできなくなってしまいます。逆に、この特性さえ理解していれば、積極的に利用する、という選択肢もあり得ます。例えば、
これこれのバージョンのOSがターゲットであり、最初からOSにこのライブラリが含まれているから常にライブラリが利用可能である、
といった判断も可能だと思います。
EXE
インストール先環境で動くプログラムなら、制約なく呼び出せます。一般的にはコンソールアプリケーション(CUIのプログラム)を使うことになると思いますが、GUI付きのプログラムも起動できます。呼び出すプログラムに情報を与えるにはコマンドライン引数を使えますが、呼び出したプログラムから情報を返すには工夫が必要です。独自にコマンドを作成する場合は、レジストリ経由で値を戻すのが最も簡単ですが、OSのコマンドが標準出力に吐き出した情報を利用する必要がある場合もあります。よく使うのはnet.exe
、netsh.exe
、sc.exe
などWindows Installerが直接サポートしない機能の利用や、cmd.exe
を使ったコマンドシェルからの内部コマンド1の利用などでしょう。
VBScript/JScript
Windows InstallerではVBScript、JScriptでカスタムアクションを記述することができます。しかし、一般的にセキュリティ上の問題や、そもそも動かなくなる可能性があることから、本番では利用すべきではないと思います。過去には、ウィルス対策ソフトの影響でインストーラーに組み込まれたVBScript、JScriptのカスタムアクションが機能せずインストールに失敗する、という事例もありました。
ここでわざわざ「本番では」と書いたのは、テストや実験では大いに役立つからです。プロパティの内容をダイアログボックスに表示したり、ちょっとした文字列操作をしたり、スクリプト言語ならではの簡便さを活かしてWindows Installer単体ではできないことや難しいことが簡単に実現できます。気を付けなければならないのは、インストーラーからはWScriptオブジェクト(Windows Scripting Hostのルートオブジェクト)を利用できない、ということです。色々便利そうな関数があるのに残念ですね。また、あまりの手軽さからこのまま本番で使いたくなります。危険ですので誘惑に負けないよう、ご注意下さい。
Error Message
インストールのエラーが発生したとき、メッセージを表示してインストールを中断させる機能です。エラーに限らず、Conditionとして設定した条件が成立したら、特定のメッセージを表示してインストールを中断します。このアクションを利用するにあたってプログラムやスクリプトを用意する必要はなく、Conditionの設定とメッセージの準備だけが必要になります。
インストーラー本来の使い方としては、これがすべてなのですが、実はデバッグで役に立つアクションでもあります。例えば監視したいプロパティを表示するよう設定しておけば、プロパティの内容を表示した後、ロールバックしてこれまでの処理を全て戻してくれます2。テストを実施する毎にテスト環境のOSをきれいに戻す必要がなく、効率的に実験やテストを進めることができます。
Set property
プロパティを設定するためのアクションです。このアクションも、プログラムやスクリプトは必要ありません。他のアクションに必要なデータを渡すために使用するケースがほとんどではないかと思います。また例えば、ユーザーに表示するメッセージにプロパティが含まれていると、プロパティが文字列に置換されないこともあるので、このアクションを使って文字列に展開させてから使うこともあります。
Set Dir
Componentで使用するDirectryの値を設定することができます。Conditionに設定した条件によってインストール先を変える、などの用途が考えられます。このアクションも、プログラムやスクリプトは必要ありません。インストール先の状況を他のカスタムアクションで取得してインストール先を変えたり、インストールウィザードでユーザーが入力した情報をもとにインストール先を変える、などに利用できそうです。3