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


VB LZHファイル操作

Unlha32 API

UNLHA32.DLLが必要です。
●標準モジュールLHA(API)用の標準モジュールの記述例
●標準モジュール(エラー定数)LHA(API)用の標準モジュール(エラー定数)の記述例
●サンプルリストLZHファイルへ圧縮するサンプルリスト
●サンプルリストLZHファイルを解凍するサンプルリスト
●サンプルリストエラーコードからエラー内容を取得するサンプルリスト
●UnlhaLZHファイルへ圧縮または解凍する
●UnlhaGetVersionUNLHA32.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]
     oSH_DENYNO でのオープンを行わない[-jso0]
     p不正なパスを拒否[-jsp1]
     s共有エラーの場合に処理を続行[-jss0]
     tFILETIME 構造体ヘッダの格納を省略[-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 : Unlhaの実行結果のログを返します。省略する時は、"" を指定。
dwSize : szOutputのサイズを指定します。省略時は、0を指定。
【 例 】 '=============================
' ファイルをLZH形式で圧縮する
'=============================
Dim result As Long             '戻り値 (成功:0 失敗:エラーコード)
Dim szOutput As String * 2048  'Unlhaの実行ログ
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 を掛けたものが返ってきます。

目次へ戻ります