ZIP圧縮ファイルを解凍するには、UnZip32.DLLを使用するか、最近発表された7-zip32.DLLを使用する。
どちらも共通アーカイバDLL仕様に沿っているので、使い方は基本的に同じなのだが、作者様が別人であるし、オリジナルのルーツも全然違う物なので、微妙に差がある。
共通アーカイバDLL仕様のDLLで、圧縮ファイルを解凍するには、MS-DOS時代のコマンドラインと同じ文字列を引数に持つUnZip32.DLLなら「UnZip関数」、7-zip32.DLLなら「SevenZip関数」を使用する。
DLL同梱のドキュメントによれば、それぞれ、
(UnZip32.DLL) int WINAPI UnZip(const HWND hWnd,LPCSTR szCmdLine, LPSTR szOutput, const DWORD dwSize); (7-zip32.DLL) int WINAPI SevenZip(const HWND _hwnd, LPCSTR _szCmdLine, LPSTR _szOutput, const DWORD _dwSize)
となっているので、Visual Basicでの宣言は、
Declare Function UnZip Lib "UnZip32.DLL" _ (ByVal hWnd As Long, _ ByVal szCmdLine As String, _ ByVal szOutput As String, _ ByVal dwSize As Long) As Long Declare Function SevenZip Lib "7-zip32.DLL" _ (ByVal hWnd As Long, _ ByVal szCmdLine As String, _ ByVal szOutput As String, _ ByVal dwSize As Long) As Long
となる。引数は全く同じである。
szCmdLineに、コマンドラインという文字列を渡すのである。やはり、DLL同梱のドキュメントによれば、
(UnZip32.DLL) [-] [[- ...] [.ZIP] [ ] [[@ | ]...] (7-zip32.DLL) [ ...] [ ] [ ...]
と一見違うように思えるが、「コマンド」「オプションスイッチ類」「圧縮ファイル名」「基準ディレクトリ」「ファイルリスト」と順序も一緒である。
しかし、書かれていないことに関して微妙に違うのである。(^_^;)
例えば、圧縮ファイル「C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip」の
中の「SRC*.Bas」ファイルを、
ディレクトリ「C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM」に解凍する場合コマンドラインは、
(UnZip32.DLL) -x -s "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*.Bas (7-zip32.DLL) x -aoa "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*.Bas
となる。
なお、7-zip32.DLLは、解凍先のディレクトリが存在しないとエラーになって解凍できない。(UnZip32.DLLはディレクトリを作成してくれる。)
また、解凍するファイルを複数指定する場合、レスポンスファイルを利用する事が多いが、レスポンスファイルとしての認識のために「@」を付けて、
(UnZip32.DLL) -x -s "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" "@C:Documents and SettingsAdministratorLocal SettingsTempresponce" (7-zip32.DLL) x -aoa "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" "@C:Documents and SettingsAdministratorLocal SettingsTempresponce"
とするが、UnZip32.DLLは「”」でレスポンスファイル名を括った後「@」を付けても、レスポンスファイル名に「@」を付けた後で「”」で括っても大丈夫だが、7-zip32.DLLは後者のみが有効である。(ドキュメントではUnZip32.DLLでも後者しか書かれていない。)
余談であるが、7-zip32.DLLを使ってZIPファイルを作成する場合で、ディレクトリを指定する場合、
u -tzip -mx -r0 "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*
のように「*」を付けないと、本当にディレクトリだけで、ディレクトリ配下のファイルやサブディレクトリは圧縮されない。