Delphi de Inno Setup Installer

戻る


  NT系Windowsは9x系Windowsと比べディスクへのアクセス権の関係でインストーラーを作成するのは結構神経つかいます。まずProgram FilesはAdministrators権限がないとインストールできません。

特に常駐型のアプリケーションのインストーラーを作成しようとした場合、実行中のアプリケーションに対してインス トーラーを動かす場合にも、一般的なインストーラーで作成すると、インストール後に再起動を促すような動きになり、これもAdministrators権 限が無いとうまく動かないかと思います。

私の代表作の「壁カレ」は、常駐型のプログラムですが、利用者は、プログラムに詳しくない人もおおいので、出来れば一般ユーザー権限で も実行できるようなインストーラーを作成しようと思いました。

そこで選択したのがオープンソースの「Inno Setup」です。しかしながら現時点最新の5.3の情報が あまりにもなく結構苦労したので、情報をまとめようかとおもいページを作りました。


■開発環境

とりあえず、Delphiはまだ3で動かしています。

Inno Setupについては、最初トライしようと思ったときの最新版が5.3.10でしたのでせっかくなのでそれをつかっています。


■前準備

まずは適当にインストールします。

インストーラーにはいくつか種類があり、いろいろとツールがついている、「ispack-5.3.10.exe」(Unicode版もあるようなの でマルチリンガルを目指すならそちらがよいのかも)がよさそうかと思います。

今までよく使われていたと思われるGUIのツールの「InnoEditX」 ですが使えないことはなさそうですが、既に開発を停止されているようなのと、最新版のInno Setupとは今ひとつ相性が悪いようです、代わりに「ispack」についている「ISTool」がその代わりになります(ただし英語・・・)。


■サンプルソース

以下は、私の壁カレ4用のインストーラのissファイルをベースにしたテキストを掲載します。行き当たりばったりで作ってるのでもしかしたら思い違いがあるかもし れません。また各行の意味についてはグーグル先生に聞いていただいたほうがより適切な情報が出てくるかと思います。

やっていることといえば、インストール時にアプリケーションが動いていたらAlt+F4を送る、同じくアンインストール時も動いていたらAlt+F4を送ることをScliptで組んでいます。
一般権限のユーザで実行できるように「PrivilegesRequired=none」にしています。またNT系OSの場合にはProgram Filesではなく各ユーザのApplication Dataフォルダを取得してそこにインストールするようにしています。本当は各ユーザのカレントフォルダに「.ApplicationName」なフォルダを作ってインストールしようと思ったのですがユーザのカレントフォルダを取得するマクロが見当たらなかったので「Application Data」フォルダにしております。

以下は、Delphi側のFormCreate部分の抜粋です。

最初はMUTEXでやろうかと思ったんですけど、なぜかうまくMUTEXが見つけられずに断念しました(文字長制限あり?)
だれかおしえてくださいませ(;_;)。
あと、実行時パスとExenameを別々に取得しているのは「壁カレ」の仕様に起因しています。 というのも、「壁カレ」は、複数のデータを処理するためにカレントディレクトリをまず取得してそこにあるiniファイルを読む仕様にしています。
またフロッピーとかUSBメモリーから起動することも出来ます。
なのでいろいろなところにある壁カレのexeプログラムがいろいろなところにあるデータを読みながら複数立ち上げることが可能な仕様にしています
なので、Formに設定しているpathは必ずしもexeがあるpathを指していません。
Inno setupでインストールしようとしている先のexeが起動中かどうか見つけるために、別途Application.exenameよりexeファイルのパスを取得しそれをApplication.titleに設定しています。
もしかしたらもっといい方法があるかもしれません。
Inno setupのFindWindowByWindowNameはちゃんとApplication.Title側を拾って「Alt+F4」を送ってくれるようなので、壁カレが終了します。
「Alt+Tab」で表示されるアプリケーション名はちゃんとMainのFormのCaptionが表示されています。

壁カレのような仕様ではなく起動がひとつだけの場合には素直にMUTEXにIDなどの固定文字列で処理すれば何倍も簡単だと思います・・・

 戻る