Cab32.dllを使って自己解凍書庫を作ろうと思ったのですが、このファイルを使って作成する場合、解凍時に実行するファイル(つまりインストーラ)を自分で指定することはできるのでしょうか?
Cab32.dll に同梱されているドキュメントを斜め読みした限りでは、そのような機能について書かれているものはありませんね。
ここで質問すると、より濃い答えが得られると思います。
http://www.madobe.net/archiver/dev/ml.html
なるほど・・・。
ではマイクロソフトのCabinet SDKではどうでしょう?
そういう記述があるようには思えなかったのですが・・・。
> ではマイクロソフトのCabinet SDKではどうでしょう?
> そういう記述があるようには思えなかったのですが・・・。
Cabinet SDK は読んでませんが、おそらく無いでしょうね。
解凍時に実行するファイルってのは、別に Cab ファイルの中にそういうデータが格納されているわけではなく、自己解凍 exe がサービスでやってくれているだけですから。
Cabinet SDK には、純粋にデータを Cab 圧縮/解凍するコードしか無いでしょう。
あ、そうだったんですか・・・。
ではインストーラを作ろうと思ったら、自分でプログラム側に解凍処理を組み込んで、そのアプリのどこかに解凍すべきデータを組み込んでおく必要があるということですか?
既存のインストーラを使うのではなく、インストーラを作ろうとするなら、そういうことになります。
Cab ファイルの中に、圧縮するファイルと一緒に、インストーラの設定を書いた ini ファイルでも入れておいて、自己解凍プログラムが書庫を解凍する際にそれを読み込んで、書庫内のインストーラを実行するという流れになるでしょう。
では使用者が最初にダブルクリックしたとき、どんな処理が行われることになるのでしょうか?
自分で作ったインストーラが実行されるのはその後ですよね?
自己解凍スタブと呼ばれる exe が実行されます。
インストーラ込み自己解凍書庫というのは、自己解凍スタブ+Cab 書庫ファイル(インストーラ入り)+自己解凍情報 から成り立つと思います。
自己解凍情報というのは、(Lha を例に取れば)特殊な名前のファイルで、解凍後に実行するアクション(インストーラを実行する、など)などが記述されています。
まず、自己解凍スタブが実行され、書庫ファイルを解凍します。
その際、特殊なファイル名の自己解凍情報ファイルは、読み込まれますがファイルとしては解凍されず、ユーザの目には見えません。
解凍が終わったら、読み込んでおいた情報ファイルの記述にしたがって、Cab ファイル内にあるインストーラが起動されます。
なお、これはあくまで例であり、この通りになるとは限りません。
情報ファイルを読み込むのは解凍した後ということも、解凍の最初ということもありえるでしょうし、自己解凍スタブとインストーラが一体化しているケースもありうるでしょう。
どういう形を取るかは、ケースバイケースです。
当初の質問「解凍後にインストーラを自動実行するような自己解凍書庫を作るには」という質問に答えるならば、「そういう自己解凍スタブを作ってください」という答えになります。
つまり、解凍処理を組み込んだ自己解凍スタブと、自己解凍情報の設定ファイルを作ればいいのですか?
その際、自己解凍スタブや自己解凍処理のファイル名の決め方には何か規則があるのでしょうか?
> その際、自己解凍スタブや自己解凍処理のファイル名の決め方には何か規則があるのでしょうか?
一切ありません。お好きなように。
ただし、自己解凍スタブのファイル名=自己解凍書庫のファイル名ですから、ユーザが決められた方がいいでしょう。
また、自己解凍情報ファイルの名前は、書庫内に格納される他のファイル名とダブってはいけません。
> 自己解凍スタブのファイル名=自己解凍書庫のファイル名
補足しておくと…
自己解凍書庫というのは、自己解凍スタブである exe ファイルと、自己解凍ではない普通の書庫ファイルをくっつけて一つのファイルにしたものです。
>補足しておくと…
>自己解凍書庫というのは、自己解凍スタブである exe ファイルと、自己解凍ではない普通の書庫ファイルをくっつけて一つのファイルにしたものです。
どうやって自己解凍スタブと普通の書庫ファイルをくっつけるのですか?
単にバイナリ的にくっつけるだけです。
copy /b でもいいし、プログラミング的にやるなら、ReadFile とか WriteFile とか使って。
スタブを作って、その後ろに書庫を押し付ける(?)だけですか?
大抵の場合はそうです。
もちろん、スタブはどこからが書庫ファイル部分なのか、その始点を見つけて解凍することになります。
なるほど。
丁寧に解説していただき、ありがとうございました。
がんばって作成してみたいと思います。
すいません。
解決のチェックを忘れてしまいました。
ツイート | ![]() |