============================================================================ GZIP、BZIP2 で圧縮して書庫化 Bga32.dll version 0.34 木村 利靖 Toshinobu Kimura ============================================================================ 0.はじめに ============ このたびは「Bga32.dll」をダウンロードして頂きありがとうございます。 Bga32.dll は、高圧縮率をほこりながら単一ファイルにしか操作を施せないという 限定性のために( ? )、いまひとつ使用されていない( らしい ? ) GZIP( .GZ )、 BZIP2( .BZ2 ) を書庫化して、複数ファイルの圧縮や解凍を便利に手軽に行える ようにしようという安易な発想のもとに作成したDLLです。 書庫を圧縮するのではなく .GZ / .BZ2 で圧縮したファイルから 書庫( .GZA / .BZA )を作成することで、書庫の格納ファイルを主体とした操作を 可能にしました。 圧縮・解凍・格納ファイルの削除・格納ファイル名の変更などを行えます。 32ビット版ですので、Windows 95 以降、Windows NT(i386用)でのみ動作 可能です。 単独で使用することはできません。対応したアプリケーションが必要です。 また、Bga32.dll の API などの仕様は、現在「統合アーカイバプロジェクト」 ( http://www.csdinc.co.jp/archiver/ )を中心に進行中の 『統合アーカイバAPI仕様』(仮称)に準拠しています。 なお、「API仕様」は現在進行形のプロジェクトです。したがって、この Bga32.dll に含まれる機能も、最終決定版ではないと言うことを充分に認識 の上ご使用ください。 それから貴方のソフトでこのDLLに対応する場合、出来るだけダイナミック リンク(LoadLibrary/GetProcAddress)で使用するようにして、Bga32.dll が 無い環境でも、( BGA 関係が使えないだけで )問題なく動作するような設計に してください。 1.ファイルについて ==================== BGA32.TXT : このドキュメントです。 BGA32.DLL : ライブラリ本体です。 BGA32CMD.TXT : Bga32.dll でのコマンド等についての説明ファイルです。 BGA32API.TXT : Bga32.dll で使用できる API の説明書です。 BGA32API.H : Bga32.dll を使用するためのヘッダファイルです。 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 のシステムフォルダ( Windows 95/98 なら \Windows\system\、WindowsNT/2000なら \WinNT\system32\ )にコピーして お使いください。上記以外の場所に置くことは、今後の本 DLL のバージョン アップなどによる仕様変更の際、重大な問題を引き起こす可能性もあります ので、十分注意が必要です。 3.著作権及び転載について ========================== Bga32.dll は、本ライブラリを利用する権利を、必要とされる方々に無償で貸与 する、いわゆるフリーソフトウェアです。 GZIP の圧縮・解凍エンジンは ZLIB を使用しており、著作権は Jean-loup Gailly 氏と Mark Adler 氏が保有しています。 'zlib' general purpose compression library version 1.1.3, July 9th, 1998 Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler BZIP2 の圧縮・解凍エンジンは LIBBZIP2 を使用しており、著作権は Julian R Seward 氏が保有しています。 libbzip2, a library for lossless, block-sorting data compression. bzip2-0.9.5 is distributed under a BSD-style license. Copyright (C) 1996-1999 Julian R Seward. All rights reserved. 書庫( .GZA / .BZA )形式の作成、統合アーカイバ仕様に準じた DLL の作成に ついての著作権は、木村 利靖が保有しています。 プログラムに対して改変を加えたり、配布ファイルの内容を変更しないという 前提条件つきで使用、転載、配布は自由ですが、転載、配布時に、メディア代等 以上の手数料を徴収したり、使用に制限をつけることを禁じます。 また、転載、配布する場合には連絡をお願いします。 またこのソフトを使用することによって生じた結果等について、作者および 原著作者は一切の責任を負わないこととさせていただきます。 4.公開先・サポート ==================== ・「統合アーカイバプロジェクト」( http://www.csdinc.co.jp/archiver/ ) ・「ベクター」( http://www.vector.co.jp/ ) で公開していただいています。 DLL に関すること( 不具合報告や機能追加などのご要望等 )は、私あて ( EZL02235@nifty.ne.jp )に直接メールしてください。 5.判明している不具合・不具合のような仕様(^^; ============================================== ・BZA 書庫の圧縮・解凍時、状況表示ウィンドウで中止ボタンを押してもすぐに処理が 中断されない場合があります。たいていは少し待てば処理が中止されます。 ->->-> 仕様です。 6.バージョン履歴・覚え書き ============================ 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() の実装。コマンドはひと通り動作する。でも、いまはまだこれだけ。 ------------------------------------------------------------------------------