目次へ戻ります
VB サンプル


VB LZHファイル操作

Unlha32 API

UNLHA32.DLLが必要です。
●標準モジュール LHA(API)用の標準モジュールの記述例
●標準モジュール(エラー定数) LHA(API)用の標準モジュール(エラー定数)の記述例
●サンプルリスト LZHファイルへ圧縮するサンプルリスト
●サンプルリスト LZHファイルを解凍するサンプルリスト
●サンプルリスト エラーコードからエラー内容を取得するサンプルリスト
●Unlha LZHファイルへ圧縮または解凍する
●UnlhaGetVersion UNLHA32.DLLのバージョンを取得
[DLL] UNLHA32.DLL

[標準モジュール]

'=======================
' LHAファイルを解凍する
'=======================
Public Declare Function Unlha Lib "unlha32" _
(ByVal hWnd As Long, ByVal szCmdLine As String, _
ByVal szOutput As String, ByVal dwSize As Long) As Long

'=======================================
' UNLHA32.DLLのバージョン情報を取得する
'=======================================
Public Declare Function UnlhaGetVersion Lib "unlha32" () As Integer

[標準モジュール (エラー定数)]

'Constants - The Unlha32 functions return error codes.

'/* WARNING */
Private Const ERROR_DISK_SPACE = &H8005&
Private Const ERROR_READ_ONLY = &H8006&
Private Const ERROR_USER_SKIP = &H8007&
Private Const ERROR_UNKNOWN_TYPE = &H8008&
Private Const ERROR_METHOD = &H8009&
Private Const ERROR_PASSWORD_FILE = &H800A&
Private Const ERROR_VERSION = &H800B&
Private Const ERROR_FILE_CRC = &H800C&
Private Const ERROR_FILE_OPEN = &H800D&
Private Const ERROR_MORE_FRESH = &H800E&
Private Const ERROR_NOT_EXIST = &H800F&
Private Const ERROR_ALREADY_EXIST = &H8010&
Private Const ERROR_TOO_MANY_FILES = &H8011&

'/* ERROR */
Private Const ERROR_MAKEDIRECTORY = &H8012&
Private Const ERROR_CANNOT_WRITE = &H8013&
Private Const ERROR_HUFFMAN_CODE = &H8014&
Private Const ERROR_COMMENT_HEADER = &H8015&
Private Const ERROR_HEADER_CRC = &H8016&
Private Const ERROR_HEADER_BROKEN = &H8017&
Private Const ERROR_ARC_FILE_OPEN = &H8018&
Private Const ERROR_NOT_ARC_FILE = &H8019&
Private Const ERROR_CANNOT_READ = &H801A&
Private Const ERROR_FILE_STYLE = &H801B&
Private Const ERROR_COMMAND_NAME = &H801C&
Private Const ERROR_MORE_HEAP_MEMORY = &H801D&
Private Const ERROR_ENOUGH_MEMORY = &H801E&
Private Const ERROR_ALREADY_RUNNING = &H801F&
Private Const ERROR_USER_CANCEL = &H8020&
Private Const ERROR_HARC_ISNOT_OPENED = &H8021&
Private Const ERROR_NOT_SEARCH_MODE = &H8022&
Private Const ERROR_NOT_SUPPORT = &H8023&
Private Const ERROR_TIME_STAMP = &H8024&
Private Const ERROR_TMP_OPEN = &H8025&
Private Const ERROR_LONG_FILE_NAME = &H8026&
Private Const ERROR_ARC_READ_ONLY = &H8027&
Private Const ERROR_SAME_NAME_FILE = &H8028&
Private Const ERROR_NOT_FIND_ARC_FILE = &H8029&
Private Const ERROR_RESPONSE_READ = &H802A&
Private Const ERROR_NOT_FILENAME = &H802B&
Private Const ERROR_TMP_COPY = &H802C&
Private Const ERROR_EOF = &H802D&
Private Const ERROR_ADD_TO_LARC = &H802E&
Private Const ERROR_TMP_BACK_SPACE = &H802F&
Private Const ERROR_SHARING = &H8030&
Private Const ERROR_NOT_FIND_FILE = &H8031&
Private Const ERROR_LOG_FILE = &H8032&
Private Const ERROR_NO_DEVICE = &H8033&
Private Const ERROR_GET_ATTRIBUTES = &H8034&
Private Const ERROR_SET_ATTRIBUTES = &H8035&
Private Const ERROR_GET_INFORMATION = &H8036&
Private Const ERROR_GET_POINT = &H8037&
Private Const ERROR_SET_POINT = &H8038&
Private Const ERROR_CONVERT_TIME = &H8039&
Private Const ERROR_GET_TIME = &H803A&
Private Const ERROR_SET_TIME = &H803B&
Private Const ERROR_CLOSE_FILE = &H803C&
Private Const ERROR_HEAP_MEMORY = &H803D&
Private Const ERROR_HANDLE = &H803E&
Private Const ERROR_TIME_STAMP_RANGE = &H803F&
Private Const ERROR_MAKE_ARCHIVE = &H8040&
Private Const ERROR_NOT_CONFIRM_NAME = &H8041&
Private Const ERROR_UNEXPECTED_EOF = &H8042&
Private Const ERROR_INVALID_END_MARK = &H8043&
Private Const ERROR_INVOLVED_LZH = &H8044&
Private Const ERROR_NO_END_MARK = &H8045&
Private Const ERROR_HDR_INVALID_SIZE = &H8046&
Private Const ERROR_UNKNOWN_LEVEL = &H8047&
Private Const ERROR_BROKEN_DATA = &H8048&
Private Const ERROR_INVALID_PATH = &H8049&
Private Const ERROR_TOO_BIG = &H804A&
Private Const ERROR_EXECUTABLE_FILE = &H804B&
Private Const ERROR_INVALID_VALUE = &H804C&
Private Const ERROR_HDR_EXPLOIT = &H804D&
【サンプルリスト】

'=============================
' ファイルをLZH形式で圧縮する
'=============================
Dim result As Long             '戻り値 (成功:0 失敗:エラーコード)

result = Unlha(Me.hWnd, "a -x1 -r1 c:\test\sample.lzh c:\test\*.*", "", 0)

If (result <> 0) Then MsgBox "Error/Warning : 0x" & Hex(result)

【サンプルリスト】

'=============================
' LZH形式のファイルを解凍する
'=============================
Dim result As Long             '戻り値 (成功:0 失敗:エラーコード)

result = Unlha(Me.hWnd, "e -y c:\test\sample.lzh c:\test\", "", 0)

If (result <> 0) Then MsgBox "Error/Warning : 0x" & Hex(result)

【サンプルリスト】

'====================================================
' エラーコードからエラー内容を取得する標準モジュール
'====================================================
Public Function ErrorMessage_Unlha32(ByVal errCode As Long) As String
  Dim str As String
  
  Select Case errCode
    Case ERROR_DISK_SPACE        '(0x8005)
      str = "ディスクの空き容量が足りません。"
    Case ERROR_READ_ONLY         '(0x8006)
      str = "読込専用の同名ファイルが存在しています。"
    Case ERROR_USER_SKIP         '(0x8007)
      str = "ユーザによりディレクトリ作成がキャンセルされました。"
    Case ERROR_UNKNOWN_TYPE      '(0x8008)
      str = "特殊属性のファイルへ上書きできませんでした。"
    Case ERROR_FILE_CRC          '(0x800C)
      str = "ファイルのCRCが書庫の情報と異なっています。"
    Case ERROR_FILE_OPEN         '(0x800D)
      str = "ファイルの内部的なオープンエラーです。"
    Case ERROR_MORE_FRESH        '(0x800E)
      str = "展開先に同名のファイルが存在しています。"
    Case ERROR_NOT_EXIST         '(0x800F)
      str = "ファイルが展開先に存在しません。"
    Case ERROR_ALREADY_EXIST     '(0x8010)
      str = "同名のファイルが展開先に既に存在しています。"
    Case ERROR_MAKEDIRECTORY     '(0x8012)
      str = "ディレクトリの作成に失敗しました。"
    Case ERROR_CANNOT_WRITE      '(0x8013)
      str = "ファイルの書き込みに失敗しました。"
    Case ERROR_HUFFMAN_CODE      '(0x8014)
      str = "書庫が壊れています。"
    Case ERROR_HEADER_CRC        '(0x8016)
      str = "ヘッダのCRCが一致しません。"
    Case ERROR_HEADER_BROKEN     '(0x8017)
      str = "書庫のヘッダが破損しています。"
    Case ERROR_ARC_FILE_OPEN     '(0x8018)
      str = "書庫のオープンに失敗しました。"
    Case ERROR_NOT_ARC_FILE      '(0x8019)
      str = "書庫が指定されていません。"
    Case ERROR_CANNOT_READ       '(0x801A)
      str = "ファイルの読み込みに失敗しました。"
    Case ERROR_FILE_STYLE        '(0x801B)
      str = "このファイルはLZH書庫ではありません。"
    Case ERROR_COMMAND_NAME      '(0x801C)
      str = "コマンドに誤りがあります。"
    Case ERROR_MORE_HEAP_MEMORY  '(0x801D)
      str = "作業メモリを確保できませんでした。"
    Case ERROR_ENOUGH_MEMORY     '(0x801E)
      str = "処理結果のバッファを確保できませんでした。"
    Case ERROR_ALREADY_RUNNING   '(0x801F)
      str = "UNLHA32.DLL が既に動作中です。"
    Case ERROR_USER_CANCEL       '(0x8020)
      str = "ユーザにより、処理がキャンセルされました。"
    Case ERROR_HARC_ISNOT_OPENED '(0x8021)
      str = "HARCハンドルが不正です。"
    Case ERROR_NOT_SEARCH_MODE   '(0x8022)
      str = "書庫の検索に失敗しました。"
    Case ERROR_NOT_SUPPORT       '(0x8023)
      str = "サポートされていないAPIです。"
    Case ERROR_TIME_STAMP        '(0x8024)
      str = "日時指定に誤りがあります。"
    Case ERROR_TMP_OPEN          '(0x8025)
      str = "作業ファイルが開けません。"
    Case ERROR_LONG_FILE_NAME    '(0x8026)
       str = "パス名が長すぎます。"
    Case ERROR_ARC_READ_ONLY     '(0x8027)
       str = "読込専用の書庫です。"
    Case ERROR_SAME_NAME_FILE    '(0x8028)
       str = "書庫に同じ名前のファイルが存在しています。"
    Case ERROR_NOT_FIND_ARC_FILE '(0x8029)
       str = "指定された書庫ファイルが見つかりません。"
    Case ERROR_RESPONSE_READ     '(0x802A)
       str = "レスポンスファイルからの読込に失敗しました。"
    Case ERROR_NOT_FILENAME      '(0x802B)
       str = "ファイルが指定されていません。"
    Case ERROR_TMP_COPY          '(0x802C)
       str = "作業用書庫へコピーできません。"
    Case ERROR_EOF               '(0x802D)
       str = "予期しない箇所でファイルの終わりが検知されたました。"
    Case ERROR_ADD_TO_LARC       '(0x802E)
       str = "この書庫は操作できません。"
    Case ERROR_TMP_BACK_SPACE    '(0x802F)
       str = "作業中にディスクの空き容量がなくなりました。"
    Case ERROR_SHARING           '(0x8030)
       str = "ファイルの共有エラーが発生しました。"
    Case ERROR_NOT_FIND_FILE     '(0x8031)
       str = "ファイルが見当たりません。"
    Case ERROR_LOG_FILE          '(0x8032)
       str = "ログファイルへの書き込みに失敗しました。"
    Case ERROR_NO_DEVICE         '(0x8033)
       str = "デバイス(ドライブ) にアクセスできません。"
    Case ERROR_GET_ATTRIBUTES    '(0x8034)
       str = "ファイルの属性取得に失敗しました。"
    Case ERROR_SET_ATTRIBUTES    '(0x8035)
       str = "ファイルの属性変更に失敗しました。"
    Case ERROR_GET_INFORMATION   '(0x8036)
       str = "ファイルの情報取得に失敗しました。"
    Case ERROR_GET_POINT         '(0x8037)
       str = "ファイル操作に失敗しました。"
    Case ERROR_SET_POINT         '(0x8038)
       str = "ファイル操作に失敗しました。"
    Case ERROR_CONVERT_TIME      '(0x8039)
       str = "タイムスタンプの変換に失敗しました。"
    Case ERROR_GET_TIME          '(0x803A)
       str = "タイムスタンプの取得に失敗しました。"
    Case ERROR_SET_TIME          '(0x803B)
       str = "タイムスタンプの設定に失敗しました。"
    Case ERROR_CLOSE_FILE        '(0x803C)
       str = "ファイルをクローズできませんでした。"
    Case ERROR_HEAP_MEMORY       '(0x803D)
       str = "ヒープメモリの解放に失敗しました。"
    Case ERROR_HANDLE            '(0x803E)
       str = "FindClose の呼び出しに失敗しました。"
    Case ERROR_TIME_STAMP_RANGE  '(0x803F)
       str = "タイムスタンプが不正です。"
    Case ERROR_MAKE_ARCHIVE      '(0x8040)
       str = "書庫が正常に作成できませんでした。"
    Case ERROR_NOT_CONFIRM_NAME  '(0x8041)
       str = "パス名が正しく記録できませんでした。"
    Case ERROR_UNEXPECTED_EOF    '(0x8042)
       str = "ヘッダ読み込みに失敗しました。"
    Case ERROR_INVALID_END_MARK  '(0x8043)
       str = "不正な終了情報が書庫のエンドマークとして記録されています。"
    Case ERROR_INVOLVED_LZH      '(0x8044)
       str = "他の書庫に格納されている LZH書庫です。"
    Case ERROR_NO_END_MARK       '(0x8045)
       str = "必要な終了情報が書庫のエンドマークとして記録されていません。"
    Case ERROR_HDR_INVALID_SIZE  '(0x8046)
       str = "不正なヘッダサイズです。"
    Case ERROR_UNKNOWN_LEVEL     '(0x8047)
       str = "unlha32.DLL で扱えないヘッダ形式です。"
    Case ERROR_BROKEN_DATA       '(0x8048)
       str = " 格納ファイルが壊れています。"
    Case ERROR_INVALID_PATH      '(0x8049)
       str = "パスが基準ディレクトリやルートディレクトリを越えています。"
    Case ERROR_TOO_BIG           '(0x804A)
       str = "ファイルサイズが大きすぎます。"
    Case ERROR_EXECUTABLE_FILE   '(0x804B)
       str = "この拡張子は抑止されています。"
    Case ERROR_INVALID_VALUE     '(0x804C)
       str = "パラメータの整合性がとれません。"
    Case ERROR_HDR_EXPLOIT       '(0x804D)
       str = "不正なヘッダが見つかりました。"
    Case 0
       str = "正常に処理が終了しました。"
    Case Else
       str = "登録されていないエラーが発生しました。"
  End Select
  ErrorMessage_Unlha32 = str
End Function
●Unlha

【機能】 LHAファイルを解凍します。成功すれば、0を返します。
【宣言】 Public Declare Function Unlha Lib "unlha32" _
(ByVal hwnd As Long, ByVal szCmdLine As String, _
ByVal szOutput As String, ByVal dwSize As Long) As Long

hwnd : ウィンドウハンドルを指定します。
szCmdLine : Unlhaに渡すコマンドを指定します。
  
コマンドの書式
[<command>] [[-<switch>[+|-|0|1|2]]...] <archive_file_name>[.LZH]
[[<base_directory_name>\] [<path_name>|<wild_name>]...]]...

<command>
   a 書庫にファイルを追加
   c 書庫内のファイルに注釈を入れる
   d 書庫からファイルを削除
   e 書庫内のファイルを展開
   f 書庫のファイルを更新
   j 書庫に別の書庫を加える
   l 書庫の内容の一覧出力
   m 書庫にファイルを移動
   n 書庫内のファイルの名前を変更
   p テキストファイルをバッファへ出力
   s 既存書庫を変換して自己解凍書庫を作成
   t 書庫の完全性検査
   u 書庫へのファイルの更新・追加
   v 書庫の内容の冗長な一覧表示
   x パス情報を有効にしてファイルを展開
   y 新しいスイッチで書庫を変換
  
<switch> 1:ON、0:OFF
   - レスポンスファイル指定文字の設定 [--@]
   + レジストリの設定を無視。 [-+0]
   a[0|1|2] 属性の保存。 [-a0]
   c[0|1] タイムスタンプ検査を省略 [-c0]
   d[0|1] ディレクトリの格納 [-d0]
   e[0|1] スライド辞書サイズを半分にして圧縮 [-e1]
   f[0|1] ディスク容量チェックの中止 [-f0]
   h[0|1|2|3] ヘッダの形式を指定 [-h2]
   i[0|1|2|3] ファイル検索で大文字と小文字を区別  
   j スイッチ文字の意味を交替させる  
   l[0|1|2] 展開ログのファイル名の表示法の変更 [-l0]
   m[0|1|2] 質問に yes と仮定 [-m0]
   n[0|1] 展開状況ダイアログ表示の抑止 [-n0]
   o[0|1|2|3] 旧形式で書庫を作成 [-o3]
   p[0|1|2] 全パス名で合致 [-p0]
   r[0|1|2] 再帰的検索 [-r0]
   s[0|1] スキップ表示の抑制 [-s0]
   t[0|1] 書庫の更新日時の指定 [-t0]
   u[0|1|2|3] ファイルの更新 (不在と新しいもの) [-u1]
   u2 ファイルの更新 (不在と古いもの)  
   u3 ファイルの更新 (不在と異なるもの)  
   w[0|1|<作業ディレクトリ名>] 作業用ディレクトリの指定 [-w1]
   x[0|1] ディレクトリ名を有効にする [-x0]
   y[0|1] すべての質問に yes と仮定 [-y0]
   z[0|1|2|<拡張子>] 未圧縮ファイルの指定 [-z0]
   jb[<パス名>] 書庫内の基準ディレクトリを指定  
   jc[0|1] 破損ヘッダを無視 [-jc0]
   jd[<サイズ>] ディスクの空き容量を確認 [-jd0]
   je[<サイズ>] Huffman バッファの大きさを指定 [-je16384]
   jf[0|1|2] ルート記号の削除 [-jf1]
   jh[0|1] WindowsNT/95 専用のマークを書庫に付加 [-jh0]
   ji[0|1] 短いファイル名で格納・展開 [-ji0]
   jm[0〜8|a|m] 圧縮形式を指定 [-jm2]
   jn[0|1] 新規ファイルのみ [-jn0]
   jo[b][<時間指定>] 指定日時以降のファイルを処理  
   jp[0|1] 進捗バーをプログレス・バーで表示 [-jp0]
   jr[0|1] ファイルの置き換え [-jr0]
   js<フラグ> 各種フラグの設定  
      a 書き戻し後に削除 [-jsa0]
      b メッセージループを回さない [-jsb0]
      c 展開できなかったファイル数を返す [-jsc0]
      d 空き容量取得に失敗した場合の処理を指定 [-jsd0]
      e 展開時の上書きオープン等をエラーとする [-jse0]
      f タイムスタンプの補正を行わない [-jsf1]
      g 書庫の後ろに存在する余剰データを許可しない [-jsg1]
      l 圧縮・格納ファイルの重複チェックを行わない [-jsl0]
      m サウンドを使用する [-jsm0]
      n ヘッダ内のパス長不正の場合にエラー [-jsn0]
      o SH_DENYNO でのオープンを行わない [-jso0]
      p 不正なパスを拒否 [-jsp1]
      s 共有エラーの場合に処理を続行 [-jss0]
      t FILETIME 構造体ヘッダの格納を省略 [-jst1]
      v 書庫操作後に書庫をチェック [-jsv0]
      z 小文字の拡張子を付加 [-jsz0]
   jt<フラグ> 各種フラグの設定  
      b バックアップモードを指定 [-jtb0]
      c 指定したファイルのみ格納 [-jtc0]
      l<コードページ> ヘッダのコードページを指定  
      p[<優先順位>] 優先順位の指定  
      s[0|<文字数>] スペース文字の連続数を指定 [-jts]
      u[0|1|2] Unicode 名ヘッダの扱いを指定 [-jtu1]
      z[0|1|<拡張子>] 実行可能ファイルの指定 [-jtz1]
   jw[j|e][0|1|2|3|4] WinSFX/WinSFXM を作成 [-jw0]
   jx[<ファイル名>] 除外するファイル名  
   jy[<フラグ>] yes と仮定して質問を抑制  
      b 不正パス警告の処理選択確認を省略  
      c ディレクトリ作成の確認を省略  
      d ファイル削除の確認を省略  
      k 使用できるディスク容量の確認の省略  
      n 新ファイル名の要求の省略  
      o 既存ファイルへの上書き確認の省略  
   jz[<ファイル名>] ファイル注釈のファイルを供給  
   ga[0|1|2] 書き込み不可属性を無視 [-ga0]
   gb[<ファイル名>] ファイル・モードを指定  
   gd[0|1] 余分なデータの削除 [-gd0]
   ge[0|1] 最初の拡張子を認識 [-ge0]
   gf[0|1|2|3] すでにある新しいファイルの更新 [-gf0]
   gf2 すでにあるより古いファイルの更新  
   gf3 すでにある異なるファイルの更新  
   gj[0|1] x 命令を e 命令と同様と見なす [-gj0]
   gl[<ファイル名>] ログをファイルに出力  
   gm[0|1] エラーメッセージ表示の抑止 [-gm0]
   gn[0|1|2] 展開ファイルの合計サイズを 100% とした進捗グラフの表示 [-gn0]
   go[0|1] ダイアログのオーナーウィンドウの指定 [-go0]
   gp[0|1] ウィンドウを Disable にしない [-gp0]
   gq[0|1] ダイアログを前面に表示 [-gq0]
   gr[<ファイル名>] 変更ファイル名を供給  
   gs[<サイズ>] ヘッダ検索サイズの指定 [-gs-]
   gt[0|1] 特殊ディレクトリ指定を解析 [-gt0]
   gu[0|1] WinSFX,DosSFX にすべてのファイルを格納 [-gu0]
   gw[j|e][0|1|2|3|4] WinSFX32/WinSFX32M を作成  
   gx<フラグ> WinSFX(32) の省略値を指定  
   gy<サブスイッチ> WinSFX(32) の各種パラメータを指定  
      a[0|1] 属性を解凍 [-gya1]
      c[0|1] タイムスタンプチェックの省略 [-gyc1]
      d<ディレクトリ> 解凍先ディレクトリを指定  
      e<コマンド文字列> 実行コマンドを指定  
      o[0|1] 自動上書きを指定(上書き確認を行わない) [-gyo0]
      q[0|1] 自動実行を指定 [-gyq0]
      s[0|1] 改竄チェックを行う [-gys0]
      t<タイトル文字列> 解凍先ディレクトリ欄タイトルの設定  
      w<タイトル文字列> ダイアログのタイトルの設定  
      x[0|1] ディレクトリ情報の復元を行う [-gyx0]
szOutput : Unzipの実行結果のログを返します。省略する時は、"" を指定。
dwSize : szOutputのサイズを指定します。省略時は、0を指定。
【 例 】 '=============================
' ファイルをLZH形式で圧縮する
'=============================
Dim result As Long             '戻り値 (成功:0 失敗:エラーコード)
Dim szOutput As String * 2048  'Unzipの実行ログ
result = Unlha(Me.hWnd, "a -x1 -r1 c:\test\sample.lzh c:\test\*.*", szOutput, Len(szOutput))
szOutput = Left(szOutput, InStr(szOutput, vbNullChar) - 1)
Debug.Print szOutput
If (result <> 0) Then MsgBox "Error/Warning : 0x" & Hex(result)
※ 失敗、もしくは、ユーザキャンセルした場合は、戻り値にエラーコードが返ります。Err.LastDllErrorには、GetLastErrorのエラーコードがセットされます。

※ フォルダやファイル名にスペースがある場合は、ダブルクォーテーションで囲みます。
   "a -x1 -r1 " & Chr(34) & "c:\Program Files\sample.lzh" & Chr(34) & " " & Chr(34) & "c:\My Documents\*.*" & Chr(34)
●UnlhaGetVersion

【機能】 UNLHA32.DLLのバージョンを返します。
【宣言】 Public Declare Function UnlhaGetVersion Lib "unlha32" () As Integer
【 例 】 result = UnlhaGetVersion()
※ 戻り値のバージョンは、版数に 100 を掛けたものが返ってきます。

目次へ戻ります