Inno Setup
http://www.jrsoftware.org/isinfo.php
というのを使っているのだけど、
ちょいとその小ネタを。
Inno Setupには、前回インストールしたものに対して
バージョンアップしたものを上書きインストールしたい場合に、
前回インストールしたときのフォルダを検出して
自動的にそこにインストールしたりしてくれるような
機能が用意されていたりはするのだけど、
「旧バージョンがインストールされてるけどアップデートする?」
的なメッセージを表示させるような機能は用意されていないので、
それを作ってみた。
・・・作ってみたのだが、
これがまた簡単そうで意外と面倒くさかった。
[Code] セクションで自前でスクリプトを書かなければならず、
全く書いたことのなかったよくわかんらんPascal言語の文法で
悩まされることに・・・。
未だに If - else 構文の理屈がよくわんねー
ま、それは置いといて、
こんな感じのスクリプトになった。
[Code]
// ------------------------------------------------------------
// 前回インストールしたアプリケーションの情報が格納されている(はず)の
// レジストリのパスを返す関数。
// Inno Setupで作成したインストーラーは、
// ここにアプリケーション名やらバージョンなどの情報を格納している。
// (試しに regedit で覗いてみるのがおすすめ。)
// ------------------------------------------------------------
function GetAppInstallRegKey() : string;
begin
Result := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\([Setup]セクションのAppIdに設定した値)';
end;
// ------------------------------------------------------------
// 上書きインストールかどうかを調べる関数。
// (レジストリに別なバージョンのインストール情報があるかどうかを調べる。)
// ------------------------------------------------------------
function IsUpdateInstall() : Boolean;
var
key : string;
begin
key := GetAppInstallRegKey();
if RegKeyExists(HKEY_LOCAL_MACHINE, key) then begin
Result := true
end else begin
Result := false;
end;
end;
// ------------------------------------------------------------
// すでにインストールされているヤツのバージョンを取得する関数。
// ------------------------------------------------------------
function GetPrevVersion() : string;
var
prevVersion : string;
key : string;
begin
key := GetAppInstallRegKey();
if RegQueryStringValue(HKEY_LOCAL_MACHINE, key, 'DisplayVersion', prevVersion) then
begin
Result := prevVersion;
end;
end;
// ------------------------------------------------------------
// インストール開始時に呼び出される関数。
// ------------------------------------------------------------
function InitializeSetup(): Boolean;
var
// すでにインストールされているヤツのバージョン
prevVersion : string;
// 上書きインストールを実行するかどうか
doUpdate : Boolean;
begin
// 別なバージョンがインストール済みかどうかを確認して、
if IsUpdateInstall() then begin
// そうなら、前回インストールしたヤツのバージョンを取得して、
prevVersion := GetPrevVersion();
// メッセージを表示。( #13 で改行文字が入るらしい。)
// Yes が選択されたら 変数 doUpdate に true が入る。
doUpdate := MsgBox('バージョン ' + prevVersion + ' がすでにインストールされています。' #13 'バージョン (ほげほげ) で上書きインストールを実行しますか?', mbConfirmation, MB_YESNO) = idYes;
if doUpdate then begin
// Yes が選択されたら、この関数の戻り値に true を設定。
Result := true;
end else begin
// No なら、キャンセルされる旨のメッセージを表示して、
MsgBox('セットアップはキャンセルされました。', mbInformation, MB_OK);
// 戻り値に false を設定。
// この関数が false を返すと、セットアップが中止される。
Result := false;
end;
end else begin
// 新規のインストールなので特に何もしない。
Result := true;
end;
end;
あと、[Setup]セクションで、
DisableDirPage=auto
DisableProgramGroupPage=auto
と書いておく。
DisableDirPage は、
インストール先ディレクトリの選択画面を表示するかどうかのオプション。
DisableProgramGroupPage は、
スタートメニューに作成するプログラムグループを指定する画面を
表示するかどうかのオプション。
これらを、"auto" にしておくと、
新規インストールの時はその画面が表示され、
アップデートするときは表示されずに前回インストール時の
ディレクトリなりプログラムクループなりが自動で選択されるようになる。