ZIP32J.DLLをVBSから利用してファイルをZIP圧縮する。

以前エントリで 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