以前エントリで VBS から LZH 圧縮するサンプルを提示したが、その ZIP 圧縮版である。
今回も総合アーカイバプロジェクトから導入の
ZIP32J.DLL というライブラリを用いた方法となる。
実のところ、DLL を用いない OS 標準機能での ZIP 圧縮方法もあるにはあるのだが、
圧縮実行後にウエイトを設けないと失敗することがあるらしい(非同期圧縮じゃない?)のと、
パスワード付き ZIP を作れない仕様だったため、選択からは外した。
利用する Win32API 関数はこちら。
ZIP32J.DLL
int WINAPI Zip(const HWND hWnd,LPCSTR szCmdLine,LPSTR szOutput, const DWORD dwSize);
見て解るとおり、UNLHA32.DLL の Unlha 関数に酷似しているので、
コード自体は前に書いたものを少し弄るだけで対応出来た。
ラッパー関数
' Zip関数(ZIP32J.DLL)を実行する。 ' 操作に成功したらTrueを、そうでなければFalseを返す Function ExecZip(szCmdLine) Const DW_SIZE = 256 ' 出力バッファサイズ Dim command ' ZIP32J.DLL 呼び出しコマンドを生成する command = "CALL(""Zip32j"", ""Zip"", ""JJCFJ"", 0, " & """" & szCmdLine & """" & ", 0, " & DW_SIZE & ")" ' zip32j を呼び出す If CreateObject("Excel.Application").ExecuteExcel4Macro(command) = 0 Then ExecZip = True Else ExecZip = False End If End Function
これもまた ExecuteExcel4Macro 関数経由で実行。
実際の呼び出しは以下の通り。
Sub Test() If ExecZip("-j -u """"c:\work\test.zip"""" """"c:\work\test.txt""""") = False Then MsgBox "ExecZip error!" End If End Sub
ExecZip 関数に渡したコマンドは、
指定ファイルを同名で ZIP 圧縮、但しファイルパスを含めない、
といったものである。
(test.zip の中には test.txt のみ入っている。)
より高度な圧縮を行いたい場合、以下の API 説明を参考にすると良いだろう。
ZIP32J.DLL ZIP系API一覧とその説明 ...
http://openlab.jp/tsuneo/soft/zip32j/zip32j/SDK/API_ZIP.TXT
ZIP32J.DLL Zip() APIのコマンド説明 ...
http://openlab.jp/tsuneo/soft/zip32j/zip32j/SDK/CMD_ZIP.TXT