============================================================================ GZIP、BZIP2 で圧縮して書庫化 Bga32.dll version 0.37 木村 利靖 Toshinobu Kimura ============================================================================ 0.はじめに ============ このたびは「Bga32.dll」をダウンロードして頂きありがとうございます。 Bga32.dllは、高圧縮率をほこりながら単一ファイルにしか操作を施せないという 限定性のために( ? )、Windows環境では今ひとつ使用されていない( らしい ? ) GZIP( .GZ )、BZIP2( .BZ2 )を書庫化して、複数ファイルの圧縮や解凍を便利に 手軽に行えるようにしようという安易な発想のもとに作成した DLLです。 書庫を圧縮するのではなく .GZ/.BZ2で圧縮したファイルから書庫( .GZA/.BZA ) を作成することで、書庫の格納ファイルを主体とした操作を可能にしました。 圧縮・解凍・格納ファイルの削除・格納ファイル名の変更などを行えます。 32ビット版ですので、Windows95以降、Windows NT(i386用)で動作が可能です。 単独で使用することはできません。対応したアプリケーションが必要です。 また、Bga32.dllの APIなどの仕様は、現在「統合アーカイバプロジェクト」 ( http://www.csdinc.co.jp/archiver/ )を中心に進行中の『統合アーカイバAP I仕様』(仮称)に準拠しています。 なお、「API仕様」は現在進行形のプロジェクトです。したがって、この Bga32.dllに含まれる機能も、最終決定版ではないと言うことを充分に認識の上ご 使用ください。 それと貴方のソフトでこの DLLに対応する場合、ダイナミックリンクで使用する ようにして、Bga32.dllが存在しない環境でも( .GZA/.BZAの圧縮、解凍機能が使 えないだけで )問題なく動作するような設計にしてください。 1.ファイルについて ==================== BGA32.TXT : このドキュメントです。 BGA32.DLL : ライブラリ本体です。 SDK/BGA32CMD.TXT : Bga32.dllでのコマンド等についての説明ファイルです。 SDK/BGA32API.TXT : Bga32.dllで使用できる APIの説明書です。 SDK/BGA32API.H : Bga32.dllを使用するためのヘッダファイルです。 SDK/BGA32.LIB : Bga32.dllを静的リンクするためのライブラリです。 なおこれは VC++用ですので、BC++等では使用出来ません。 また上記にも書いたように、できればこれは使わずに ダイナミックにリンクする方法をお取りください。 2.使い方 ========== これはライブラリですので、単独では使用できません。 A. アプリケーションから ----------------------- APIについては,BGA32API.TXTをご覧ください。 Bga() APIで指定するコマンドラインの詳細は BGA32CMD.TXTをご覧ください。 Bga32.dllを使用するには BGA32API.Hをインクルードし、リンク時に BGA32.LIBをリンクするか、LoadLibrary()/GetProcAddress() により ダイナミックにリンクすることが必要です(できるだけこちらの方法を)。 B. 一般ユーザから ----------------- この DLLを使用するためには、対応したアプリケーションが必要です。 また、この DLLは Windowsのシステムディレクトリ(通常は Windows95/98 なら \Windows\system\、WindowsNT/2000なら \WinNT\system32\ )にコピー してお使いください。上記以外の場所に置くことは、今後の本 DLLのバージョ ンアップなどによる仕様変更の際、重大な問題を引き起こす可能性もあります ので、十分注意が必要です。 3.著作権及び転載について ========================== Bga32.dllは、本ライブラリを利用する権利を、必要とされる方々に無償で貸与 する、いわゆるフリーソフトウェアです。 GZIP の圧縮・解凍エンジンは ZLIB を使用しており、著作権は Jean-loup Gailly 氏と Mark Adler 氏が保有しています。 zlib 1.1.4 is a general purpose data compression library. (C) 1995-2002 Jean-loup Gailly and Mark Adler BZIP2 の圧縮・解凍エンジンは LIBBZIP2 を使用しており、著作権は Julian R Seward 氏が保有しています。 bzip2-1.0.2 is distributed under a BSD-style license. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. また、.GZA/.BZAの自己解凍モジュールは UPXを使用して圧縮しています。 The Ultimate Packer for eXecutables Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar 書庫( .GZA / .BZA )形式の作成、統合アーカイバ仕様に準じた DLLの作成に ついての著作権は、木村 利靖が保有しています。 プログラムに対して改変を加えたり、配布ファイルの内容を変更しないという 前提条件つきで使用、転載、配布は自由ですが、転載、配布時に、メディア代等 以上の手数料を徴収したり、使用に制限をつけることを禁じます。 また、転載、配布する場合には連絡をお願いします。 またこのソフトを使用することによって生じた結果等について、作者および 原著作者は一切の責任を負わないこととさせていただきます。 4.公開先・サポート ==================== ・「統合アーカイバプロジェクト」( http://www.csdinc.co.jp/archiver/ ) ・「ベクター」( http://www.vector.co.jp/ ) で公開していただいています。 DLL に関すること( 不具合報告や機能追加などのご要望等 )は、私あて ( EZL02235@nifty.ne.jp )に直接メールしてください。 5.判明している不具合・不具合のような仕様(^^; ============================================== ・BZA書庫の圧縮・解凍時、状況表示ウィンドウで中止ボタンを押してもすぐに処 理が中断されない場合があります。たいていは少し待てば処理が中止されます。 ->->-> 仕様です。 ・version 0.36以降で作成した自己解凍形式書庫ファイルは、version 0.35以前の Bga32.dllでは書庫ファイルと認識できません。通常の書庫ファイルは問題なく 認識できます。version 0.35以前の Bga32.dllで作成した書庫ファイル、自己解 凍形式書庫ファイルは version 0.36以降でも認識可能です。 6.バージョン履歴・覚え書き ============================ version 0.37 2002/06/04 ・version0.36での書庫ヘッダ検索に問題があり、自己解凍書庫を正常に操作 できなかった不具合を修正しました。 version 0.36 2002/06/01 ・BZAの圧縮解凍エンジンを bzip2-1.0.2 に差替えました。 ・GZAの圧縮解凍エンジンを zlib 1.1.4 に差替えました。 ・書庫の格納ファイルを一覧する'L'コマンドと'V'コマンドを追加しました。 ・レスポンスファイル文字を指定する -- スイッチを追加しました。 ・BgaOpenArchive APIでモードに M_CHECK_ALL_PATHが指定されている場合、 BgaFindFirst および BgaFindNext APIで、書庫内のサブディレクトリ内の ファイルがマッチしない場合があった不具合を修正しました。 version 0.35 2001/07/01 ・BgaCheckArchive() API などでのファイルオープン時に共有エラーが発生し た場合に落ちてしまう致命的な不具合を修正しました。 version 0.34 2001/05/12 ・Visual Studio 6.0 SP5 での再ビルド。 ・進捗ダイアログを消去した後、ダイアログに表示していた情報の残像がオー ナーウィンドウにまだ残ってしまう不具合を修正しました。 ・進捗ダイアログの消去後にオーナーウィンドウがアクティブにならない問題 にさらなる対策を加えてみました。前よりはいくらか良くなっている気がす るのですが。。。(^^; ・圧縮・解凍時に呼び出しアプリのウィンドウに対して EnableWindow() する コードがまたも無効になっていた不具合を修正しました。 version 0.33 2001/03/13 ・進捗ダイアログを表示するとき前面に配置する指定を止めました。 ・進捗ダイアログをデスクトップの中央に表示していましたが、オーナーウィ ンドウの中央に表示するように変更しました。 ・進捗ダイアログを消去した後、ダイアログに表示していた情報の残像がオー ナーウィンドウに残ってしまう不具合を修正しました。 version 0.32 2001/01/13 ・既存のディレクトリと同名の書庫を新規に作成する際に、Bga() のコマンド ラインで書庫名に拡張子を省略して指定すると例外が発生する不具合を修正 しました。 version 0.31 2000/10/28 ・Visual Studio 6.0 SP4 での再ビルド。 ・自己解凍書庫を通常の書庫に変換する j コマンドを追加しました。 version 0.30 2000/06/02 ・読み取り専用属性の付与されている、サイズが 0 バイトのファイルを圧縮 しようとすると例外が発生していた致命的な不具合を修正。 ・あわせて、書庫内のサイズが 0 バイトのファイルを解凍できなかった 不具合も修正しました。 # .BZA の圧縮エンジンに LIBBZ2.LIB version 1.0 を試用してみたところ、 圧縮率はさほど変わらないけれど、圧縮、解凍速度は向上しているみたい。 でも、自己解凍スタブのサイズが 4KB 増大するので、保留です。 version 0.29 2000/04/12 ・圧縮前後でサイズが増大した場合には無圧縮で格納するように変更。 ・無圧縮で格納しているファイルについては INDIVIDUALINFO 構造体の szMode に "-store-" を設定するように変更。 ・プログレスダイアログのファイル名の表記で '/' と '\' が混在していた 不具合を修正。 すべてを '\' で表示するようにしました。 version 0.28 2000/03/22 ・ディレクトリ検索関係の不具合を修正。 ・迂闊にも各種パス系の処理に SHLWAPI.DLL を使用してしまっていたため、 IE の存在しない環境で動作しなかった不具合を修正。 約 20 の API を自前の関数で置き換えた。 ## 自己解凍スタブのサイズが増加しなくて良かった (^^;; 鬼束裕之さん、ご協力ありがとうございました。m(__)m ・圧縮時に -a スイッチがまだ正常に動作しない場合があった不具合を修正。 ・新規書庫作成時に圧縮対象のファイルがひとつもないのに空の書庫を作成 していた不具合を修正。 ・マルチバイト文字のファイル名が場合によりマッチせず、解凍やファイル名 の変更が実行できなかった不具合を修正。 version 0.27 2000/03/09 ・レスポンスファイルにマルチバイト文字を含めて記述した場合、正常に動作 しなかった不具合を修正。 ・圧縮、解凍時に BgaSetOwnerWindow API などのメッセージ系 API を呼び出 していて、かつコマンド指定で -i スイッチを指定しない場合( つまり、 Bga32.dll の進捗ダイアログとアプリケーション独自の進捗ダイアログを 同時に表示する指定の場合 )、API を呼び出すタイミングによりメッセージ を送出できなかったり、内部のスレッドが終了しなかった不具合を修正。 この場合、BgaSetOwnerWindow 等で指定されたウィンドウへのメッセージ 送出を優先し、Bga32.dll の進捗ダイアログは表示しないようにした。 ・ディレクトリ作成関係の汎用クラスの再度の変更。 version 0.26 2000/02/20 ・ディレクトリ作成関係の汎用クラスの変更とそれに伴う修正。 ・-i スイッチ、-n スイッチの規定値を TRUE から FALSE に変更。 ・t コマンド時に書庫ファイルにエラーがあった場合、メッセージを表示する のを忘れていた不具合を修正。正常時はこれまで通り何も表示しない。 version 0.25 2000/02/16 ・解凍時に -a スイッチを有効にした。 ・あわせて、解凍時に -a スイッチが指定された場合、書庫ファイルに格納 されている空のディレクトリも解凍するようにした。 ・解凍時に属性の復元を忘れていた (^^; 不具合を修正。 version 0.24 2000/02/01 ・リネーム時に、またまたディレクトリのみのヘッダが重複して作成されてし まう場合があった不具合を修正。 ・コマンドラインで書庫ファイルの指定にパスが含まれていない場合、圧縮 しているかのような動作だけしてみせるものの書庫ファイルがどこにも 作成されない場合がある不具合を修正。カレントのディレクトリに作成する ようにした。 ・コマンドラインで書庫ファイルと基底ディレクトリを相対パスで指定した場 合、正常に動作しなかった不具合を修正( したつもり )。 version 0.23 2000/01/27 ・各種ダイアログの見た目を少しだけ変更。 ・ファイルのマッチング処理を一部修正。 ・基底ディレクトリが指定されなかった場合にカレントのディレクトリを基準 に処理するように変更。これまではルートディレクトリを基準にしていた。 ・不正なコマンド指定に対するチェックを(少しだけ)強化。 ・リネームダイアログでのチェックで、ディレクトリのみのヘッダを考慮に 入れていなかった不具合を修正。 ・リネームダイアログや削除確認のメッセージボックスのオーナーウィンドウ を設定するのを忘れていた不具合を修正。 version 0.22 2000/01/16 ・コマンドライン中で BgaConfigDialog() で指定されたスイッチを無効にする 指定をできるようにした。 ・解凍時に -r スイッチが働いていなかった不具合を修正。 version 0.21 2000/01/10 ・表記文字列の半角カタカナを全角カタカナに統一した。 ・バージョンリソースの記述を少し変更。 ・リネーム系コマンド・スイッチで、Bga32.dll 自体が扱えないファイル名 への変更も許容してしまっていた不具合を修正。実のところチェックが甘い のはこれだけではないのだけど... ・version 0.05 で修正したはずの、追加圧縮時の同名ディレクトリのヘッダ 重複格納問題が場合によりまだ発生していた不具合に対処。 version 0.20 1999/12/14 ・GZA、BZA の自己解凍書庫作成時の設定ダイアログで「解凍後、実行または 開くファイル名(E)」に指定したファイルを、自己解凍時に開けない場合が あった不具合を修正。 ・GZA、BZA の自己解凍実行時の解凍開始ダイアログで、フォーカスの初期位 置を「解凍」ボタンから「解凍先ディレクトリの指定(E)」に変更。 ・圧縮・解凍時に呼び出しアプリのウィンドウに対して EnableWindow() する コードを無効にしたままだったポカミスを修正。 version 0.19 1999/12/06 ・-a、-r スイッチが正常に機能していなかった不具合を修正。 ・また、-a、-r スイッチが未指定の場合の動作も仕様を満たしていなかった ので、あわせて修正した。 version 0.18 1999/12/05 ・呼び出し規約を _cdecl から _stdcall に変更。 ・Visual C++ 6.0 SP3 での再ビルド。 version 0.17 1999/11/16 ・自己解凍形式書庫で解凍した場合に、ファイルのタイムスタンプが 9 時間 ずれる不具合を修正。version 0.16 での修正時に忘れてました (^^;; version 0.16 1999/11/10 ・LZH,LZS,ZIP,PAK,ARC,ZOO,ARJ, TAZ, TGZ, TBZ, GZ, BZ2, CAB, RAR の拡張子をもつファイルは無圧縮で格納していたが、どんなファイルでも 圧縮するように変更。 ・他の圧縮ファイルに対してさらに圧縮を試みた場合、ときには小さくなるが 逆に数百バイト程度サイズが増大することもある。 これについてはもう少し検討が必要かも... でも、例えば LZH を無圧縮で格納すると、Unlha32.dll でチェックしたとき GZA や BZA なのに LZH だと誤認されてしまうんだよね...(^^; ・無圧縮で格納しているファイルについては INDIVIDUALINFO 構造体の szMode に "-arc-" を設定するように変更( 今後のためで、現状は無意味 (^^; )。 ・ファイルのタイムスタンプが 9 時間ずれて格納されていた不具合を修正。 ・自己解凍書庫の作成時に「タイトル」「メッセージ」「ディレクトリの初期 値」「解凍後の実行ファイル」を指定可能にする。 ・SFX スタブにさらに手を加え、GZA 用が 56KB、BZA 用が 52KB に縮小。 ・SFX スタブのアイコンを変更。 ・FPress で使用するには Arc32.dll version 0.99f 以上が必要。 version 0.15 1999/11/05 ・GZA 用、BZA 用の SFX スタブのコンパイルオプションをいろいろと変更し、 サイズをさらに縮小化。 GZA 用が 64KB、BZA 用が 60KB となる。 version 0.14 1999/11/03 ・自己解凍形式書庫に対して、ファイルの追加圧縮、書庫内ファイルの削除、 書庫内ファイル名の変更を可能とした。 操作的には通常形式書庫も自己解凍形式書庫も同等となっているはず。 version 0.08 で対応したつもりでいたのだけど、実は忘れていた (^^;; version 0.13 1999/11/02 ・bzip2 の圧縮解凍エンジンに bzip2-0.9.5d を使用するように変更した。 ・あわせて、SFX スタブ用の zlib, libbzip2 のスタティックライブラリを シングルスレッドでビルドするようにした。Bga32.dll 用はマルチスレッド でビルド。 ・SFX スタブのサイズが GZA 用、BZA 用ともに若干( 数 KB )小さくなった。 ・ちなみに gzip の圧縮解凍エンジンは以前と同じで zlib-1.1.3。 ・FPress で使用するには Arc32.dll version 0.99e 以上が必要。 version 0.12 1999/10/31 ・エラー終了時やユーザによる処理の中止時に、作成途中のファイルの残骸が 残ってしまう場合があった不具合を修正。 ・表示するダイアログボックスの動作形態を一部修正。 version 0.11 1999/10/28 ・BgaFindFirst(), BgaFindNext() で返す INDIVIDUALINFO 構造体の szMode と、メッセージ系 API で返す EXTRACTINGINFO 構造体の szMode に "-gzip-" または "-bzip2-" の文字列を設定するように仕様を変更。 version 0.10 1999/10/22 ・圧縮するファイルのサイズが 16384 のちょうど整数倍のとき、圧縮に失敗 する不具合を修正。 version 0.09 1999/10/15 ・SFX スタブのアイコンをとりあえず作成。でもいまいち。 ・GZA 用、BZA 用の SFX スタブを GZIP で圧縮して保持するように変更。 まあ version 0.08 よりは 80KB くらい小さくなったけど、まだでかい。 60KB もあるスタティックライブラリをふたつ( スタブの分を入れれば4つ ) も抱いてるから仕方ないのかな。 スタブ自体が 76KB もあるなんて...悲しい。 version 0.08 1999/10/14 ・自己解凍書庫を作成可能にする。 ・あわせて、BgaCheckArchive()、BgaOpenArchive() で SFX も認識できる ように修正。 処理的にはできてるのだけど、毎度のことながらスタブのアイコンが 決まらないのでとりあえず保留。 はたして気に入ったアイコンができあがるのはいつのことやら。 しかし DLL のサイズ、大きくなっちまったなあ... ・Arc32.dll version0.99 で .gza、.bza ともに、書庫 <-> SFX の処理を 追加。これにより FPress.exe、FPressSx.dll で SFX がらみの操作が 可能になる。 version 0.07 1999/10/12 ・複数ファイルのリネーム時に、ファイル変更ダイアログでユーザが キャンセルした場合、ファイル名が変更されないどころか、適当な名前に リネームされてしまう不具合の対処。 version 0.06 1999/10/10 ・BgaSetEnumMembersProc()、BgaClearEnumMembersProc() を実装。 ・FPress.exe で、ディレクトリ単位のリネームが可能になる。 version 0.05 1999/10/09 ・BgaSetOwnerWindow() などが呼ばれていない場合用の、自前のプログレス ダイアログを追加( 作るのを忘れてました )。 ・追加圧縮時にディレクトリのみのヘッダを作成する際、同名のディレクトリ が存在しているのに新たにヘッダを作成してしまっていた不具合の対処。 version 0.04 1999/10/07 ・BgaSetOwnerWindow(), BgaClearOwnerWindow(), BgaSetOwnerWindowEx(), BgaKillOwnerWindowEx() を実装。 ・FPress.exe、FPressSx.dll で .gza、.bza 形式書庫の圧縮・解凍時に プログレス表示が可能になる。 version 0.03 1999/10/06 ・BgaGetFileCount(), BgaOpenArchive(), BgaCloseArchive(), BgaFindFirst(), BgaFindNext(), BgaGetArcOriginalSize(), BgaGetArcCompressedSize(), BgaGetArcRatio() を実装。 ・FPress.exe で .gza、.bza 形式書庫のアイコン表示が可能になる。 ・FPress Setup 用の InstallShield スクリプトを変更し、.gza、 .bza を FPress に関連づけ指定できるようにした。 version 0.02 1999/10/04 ・BgaGetVersion()、BgaGetRunning()、BgaCheckArchive()、 BgaConfigDialog()、BgaQueryFunctionList() を実装。 ・FPress.exe、FPressSx.dll、Arc32.dll で圧縮・解凍が可能になる。 version 0.01 1999/10/02 ・Bga32.dll の最初のバージョン ・Bga() の実装。コマンドはひと通り動作する。でも、いまはまだこれだけ。 ------------------------------------------------------------------------------