/***********************************************************
UNLHA32.dllを利用するためのモジュール
【2006/7/7 更新】
●このモジュールについて
このモジュールでは、UNLHA32.dllが提供している機能を
ほぼそのまま利用するための関数(一部)と、UNLHA32.dll
の圧縮・解凍機能を手軽に利用するためのラッパー関数の
2種類の関数を定義しています。
一応、各関数の簡単な動作テストは行っていますが、モジュ
ールの利用については自己責任でお願いします。
●関数一覧
・(関数の説明)(戻り値)
(書式)
(引数などの説明)
【 UNLHA32.dllの圧縮・解凍機能を手軽に利用するためのラッパー関数 】
** 圧縮・解凍ともフォルダ階層を維持したまま行います。 **
・指定したファイルまたはフォルダをその場で圧縮する(正常終了=0 / 失敗=0以外)
#defcfunc unlha_cmp str p1, int p2
p1 = 圧縮するファイルまたはフォルダのフルパス
p2 = p1のパスにファイルとフォルダ両方があった場合にどちらを処理対象とするか
(TRUE(1)=ファイル or FALSE(0)=フォルダ)
(p2の指定に関わらず、どちらかしか存在しない場合はそれを処理対象とします)
・指定したLHA形式のファイルをその場で展開する(正常終了=0 / 失敗=0以外)
#defcfunc unlha_ext str p1, int p2
p1 = 展開するファイル(.lzh)のフルパス
p2 = lzhファイルと同じ名前のフォルダを作って
その中に展開するかどうか(TRUE(1) or FALSE(0))
【 UNLHA32.dllが提供しているものと同等の関数(一部) 】
** 引数の仕様が、UNLHA32.dllから直接呼び出す場合と **
** は一部異なるものがありますので注意して下さい。 **
** 個々の関数の詳細についてはUNLHA32.dllのドキュメ **
** ントを参照して下さい。 **
・UNLHA32.DLL のバージョンを数値で取得(整数)
#defcfunc UnlhaGetVersion
・UNLHA32.DLL のサブバージョンを数値で取得(整数)
#defcfunc UnlhaGetSubVersion
・現在 UNLHA32.DLL が動作中か否かを取得(TRUE(1) or FALSE(0))
#defcfunc UnlhaGetRunning
・UNLHA32.DLL がバックグラウンドモードか否かを取得(TRUE(1) or FALSE(0))
#defcfunc UnlhaGetBackGroundMode
・UNLHA32.DLL のバックグラウンドモードを設定(正常終了=1 / 失敗=0)
#defcfunc UnlhaSetBackGroundMode int p1
p1 = TRUE(1)かFALSE(0)を指定
・LHA.EXE 互換のコマンド文字列を与えて、各種の書庫操作を行う(正常終了=0 / 失敗=0以外)
#defcfunc Unlha int p1, str p2, var p3
p1 = UNLHA32.DLL を呼び出すアプリのウィンドウハンドル。NULL(0)でもよい
p2 = UNLHA32.DLL に渡すコマンド文字列
p3 = UNLHA32.DLL が結果を返すための文字列バッファ
・指定ファイルが書庫として正しいかどうかをチェック(LZHファイル=FALSE(0)以外)
#defcfunc UnlhaCheckArchive str p1, int p2
p1 = チェックするファイルのパス
p2 = チェックモード
・指定された書庫ファイルに格納されているファイル数(フォルダを含む)を取得(エラーのとき=-1)
#defcfunc UnlhaGetFileCount str p1
p1 = チェックするファイルのパス
・指定されたAPIが使用可能かどうかをチェック(TRUE(1) or FALSE(0))
#defcfunc UnlhaQueryFunctionList int p1
p1 = API番号
・基準ディレクトリやスイッチが指定されなかった場合の動作を指定するダイアログを表示
(TRUE(1) or FALSE(0) or ERROR_ALREADY_RUNNING(0x801f))
#defcfunc UnlhaConfigDialog int p1, var p2
p1 = ダイアログのオーナー・ウィンドウのハンドル
p2 = レジストリに書き込まれる内容と同様の動作を行う為の
コマンド文字列を得るためのバッファ(513 バイト以上)
***********************************************************/
#ifndef __GM_UNLHA32_DLL__
#define global __GM_UNLHA32_DLL__
#include "gm_isdir.hsp"
#module lha32_dll
#uselib "unlha32.dll"
#cfunc UnlhaGetVersion_ "UnlhaGetVersion"
#cfunc UnlhaGetSubVersion_ "UnlhaGetSubVersion"
#cfunc UnlhaGetRunning_ "UnlhaGetRunning"
#cfunc UnlhaGetBackGroundMode_ "UnlhaGetBackGroundMode"
#cfunc UnlhaSetBackGroundMode_ "UnlhaSetBackGroundMode" int
#cfunc Unlha_ "Unlha" int,sptr,sptr,int
#cfunc UnlhaCheckArchive_ "UnlhaCheckArchive" sptr,int
#const CHECKARCHIVE_RAPID 0
#const CHECKARCHIVE_BASIC 1
#const CHECKARCHIVE_FULLCRC 2
#const CHECKARCHIVE_RECOVERY 4
#const CHECKARCHIVE_SFX 8
#const CHECKARCHIVE_ALL 16
#const CHECKARCHIVE_ENDDATA 32
#cfunc UnlhaGetFileCount_ "UnlhaGetFileCount" sptr
#cfunc UnlhaQueryFunctionList_ "UnlhaQueryFunctionList" int
#const ISARC_FUNCTION_START 0
#const ISARC 0 /* Unlha */
#const ISARC_GET_VERSION 1 /* UnlhaGetVersion */
#const ISARC_GET_CURSOR_INTERVAL 2 /* UnlhaGetCursorInterval */
#const ISARC_SET_CURSOR_INTERVAL 3 /* UnlhaSetCursorInterval */
#const ISARC_GET_BACK_GROUND_MODE 4 /* UnlhaGetBackGroundMode */
#const ISARC_SET_BACK_GROUND_MODE 5 /* UnlhaSetBackGroundMode */
#const ISARC_GET_CURSOR_MODE 6 /* UnlhaGetCursorMode */
#const ISARC_SET_CURSOR_MODE 7 /* UnlhaSetCursorMode */
#const ISARC_GET_RUNNING 8 /* UnlhaGetRunning */
#const ISARC_CHECK_ARCHIVE 16 /* UnlhaCheckArchive */
#const ISARC_CONFIG_DIALOG 17 /* UnlhaConfigDialog */
#const ISARC_GET_FILE_COUNT 18 /* UnlhaGetFileCount */
#const ISARC_QUERY_FUNCTION_LIST 19 /* UnlhaQueryFunctionList */
#const ISARC_HOUT 20 /* (UnlhaHOut) */
#const ISARC_STRUCTOUT 21 /* (UnlhaStructOut) */
#const ISARC_GET_ARC_FILE_INFO 22 /* UnlhaGetArcFileInfo */
#const ISARC_OPEN_ARCHIVE 23 /* UnlhaOpenArchive */
#const ISARC_CLOSE_ARCHIVE 24 /* UnlhaCloseArchive */
#const ISARC_FIND_FIRST 25 /* UnlhaFindFirst */
#const ISARC_FIND_NEXT 26 /* UnlhaFindNext */
#const ISARC_EXTRACT 27 /* (UnlhaExtract) */
#const ISARC_ADD 28 /* (UnlhaAdd) */
#const ISARC_MOVE 29 /* (UnlhaMove) */
#const ISARC_DELETE 30 /* (UnlhaDelete) */
#const ISARC_SETOWNERWINDOW 31 /* UnlhaSetOwnerWindow */
#const ISARC_CLEAROWNERWINDOW 32 /* UnlhaClearOwnerWindow */
#const ISARC_SETOWNERWINDOWEX 33 /* UnlhaSetOwnerWindowEx */
#const ISARC_KILLOWNERWINDOWEX 34 /* UnlhaKillOwnerWindowEx */
#const ISARC_GET_ARC_FILE_NAME 40 /* UnlhaGetArcFileName */
#const ISARC_GET_ARC_FILE_SIZE 41 /* UnlhaGetArcFileSize */
#const ISARC_GET_ARC_ORIGINAL_SIZE 42 /* UnlhaArcOriginalSize */
#const ISARC_GET_ARC_COMPRESSED_SIZE 43 /* UnlhaGetArcCompressedSize */
#const ISARC_GET_ARC_RATIO 44 /* UnlhaGetArcRatio */
#const ISARC_GET_ARC_DATE 45 /* UnlhaGetArcDate */
#const ISARC_GET_ARC_TIME 46 /* UnlhaGetArcTime */
#const ISARC_GET_ARC_OS_TYPE 47 /* UnlhaGetArcOSType */
#const ISARC_GET_ARC_IS_SFX_FILE 48 /* UnlhaGetArcIsSFXFile */
#const ISARC_GET_ARC_WRITE_TIME_EX 49 /* UnlhaGetArcWriteTimeEx */
#const ISARC_GET_ARC_CREATE_TIME_EX 50 /* UnlhaGetArcCreateTimeEx */
#const ISARC_GET_ARC_ACCESS_TIME_EX 51 /* UnlhaGetArcAccessTimeEx */
#const ISARC_GET_ARC_CREATE_TIME_EX2 52 /* UnlhaGetArcCreateTimeEx2 */
#const ISARC_GET_ARC_WRITE_TIME_EX2 53 /* UnlhaGetArcWriteTimeEx2 */
#const ISARC_GET_FILE_NAME 57 /* UnlhaGetFileName */
#const ISARC_GET_ORIGINAL_SIZE 58 /* UnlhaGetOriginalSize */
#const ISARC_GET_COMPRESSED_SIZE 59 /* UnlhaGetCompressedSize */
#const ISARC_GET_RATIO 60 /* UnlhaGetRatio */
#const ISARC_GET_DATE 61 /* UnlhaGetDate */
#const ISARC_GET_TIME 62 /* UnlhaGetTime */
#const ISARC_GET_CRC 63 /* UnlhaGetCRC */
#const ISARC_GET_ATTRIBUTE 64 /* UnlhaGetAttribute */
#const ISARC_GET_OS_TYPE 65 /* UnlhaGetOSType */
#const ISARC_GET_METHOD 66 /* UnlhaGetMethod */
#const ISARC_GET_WRITE_TIME 67 /* UnlhaGetWriteTime */
#const ISARC_GET_CREATE_TIME 68 /* UnlhaGetCreateTime */
#const ISARC_GET_ACCESS_TIME 69 /* UnlhaGetAccessTime */
#const ISARC_GET_WRITE_TIME_EX 70 /* UnlhaGetWriteTimeEx */
#const ISARC_GET_CREATE_TIME_EX 71 /* UnlhaGetCreateTimeEx */
#const ISARC_GET_ACCESS_TIME_EX 72 /* UnlhaGetAccessTimeEx */
#const ISARC_SET_ENUM_MEMBERS_PROC 80 /* UnlhaSetEnumMembersProc */
#const ISARC_CLEAR_ENUM_MEMBERS_PROC 81 /* UnlhaClearEnumMembersProc */
#const ISARC_GET_ARC_FILE_SIZE_EX 82 /* UnlhaGetArcFileSizeEx */
#const ISARC_GET_ARC_ORIGINAL_SIZE_EX 83 /* UnlhaArcOriginalSizeEx */
#const ISARC_GET_ARC_COMPRESSED_SIZE_EX 84 /* UnlhaGetArcCompressedSizeEx */
#const ISARC_GET_ORIGINAL_SIZE_EX 85 /* UnlhaGetOriginalSizeEx */
#const ISARC_GET_COMPRESSED_SIZE_EX 86 /* UnlhaGetCompressedSizeEx */
#const ISARC_SETOWNERWINDOWEX64 87 /* UnlhaSetOwnerWindowEx64 */
#const ISARC_KILLOWNERWINDOWEX64 88 /* UnlhaKillOwnerWindowEx64 */
#const ISARC_SET_ENUM_MEMBERS_PROC64 89 /* UnlhaSetEnumMembersProc64 */
#const ISARC_CLEAR_ENUM_MEMBERS_PROC64 90 /* UnlhaClearEnumMembersProc64 */
#const ISARC_OPEN_ARCHIVE2 91 /* UnlhaOpenArchive2 */
#const ISARC_GET_ARC_READ_SIZE 92 /* UnlhaGetArcReadSize */
#const ISARC_GET_ARC_READ_SIZE_EX 93 /* UnlhaGetArcReadSizeEx */
#const SET_LANGUE_JAPANESE 94 /* SetLangueJapanese */
#const SET_LANGUE_ENGLISH 95 /* SetLangueEnglish */
#const SET_LANGUE_SPECIFIED 96 /* SetLangueSpecified */
#const ISARC_SET_LANGUE_SPECIFIED 97 /* UnlhaSetLangueSpecified */
#const ISARC_SET_LANGUE_JAPANESE 98 /* UnlhaSetLangueJapanese */
#const ISARC_SET_LANGUE_ENGLISH 99 /* UnlhaSetLangueEnglish */
#const ISARC_SET_PRIORITY 100 /* UnlhaSetPriority */
#const ISARC_FUNCTION_END ISARC_SET_PRIORITY
#cfunc UnlhaConfigDialog_ "UnlhaConfigDialog" int,sptr,int
#const UNPACK_CONFIG_MODE 1
#const PACK_CONFIG_MODE 2
#const ERROR_ALREADY_RUNNING 0x801f
#const TRUE 1
#const FALSE 0
#const SIZE_OUTPUT 256*256
#define global LHA_EXT ".lzh"
#const MAX_PATH 260
#const global UNLHA_CMP_OK 0
#const global UNLHA_CMP_ERR -1
#const global UNLHA_EXT_OK 0
#const global UNLHA_EXT_ERR -1
/***********************************************************/
#defcfunc UnlhaGetVersion
result = UnlhaGetVersion_()
return wpeek(result,0)
#defcfunc UnlhaGetSubVersion
result = UnlhaGetSubVersion_()
return wpeek(result,0)
#defcfunc UnlhaGetRunning
return UnlhaGetRunning_()
#defcfunc UnlhaGetBackGroundMode
return UnlhaGetBackGroundMode_()
#defcfunc UnlhaSetBackGroundMode int p1
if p1=0 {
mode = FALSE
}
else {
mode = TRUE
}
return UnlhaSetBackGroundMode_(mode)
#defcfunc Unlha int p1, str p2, var p3
hw = p1
cmd = p2
sdim buf, SIZE_OUTPUT+1
result = Unlha_(hw, cmd, buf, SIZE_OUTPUT)
p3 = buf
return result
#defcfunc UnlhaCheckArchive str p1, int p2
return UnlhaCheckArchive_(p1, p2)
#defcfunc UnlhaGetFileCount str p1
return UnlhaGetFileCount_(p1)
#defcfunc UnlhaQueryFunctionList int p1
return UnlhaQueryFunctionList_(p1)
#defcfunc UnlhaConfigDialog int p1, var p2
return UnlhaConfigDialog_(p1,p2,UNPACK_CONFIG_MODE)
/***********************************************************/
#defcfunc unlha_cmp str p1, int p2
/* ファイル存在チェック */
exist p1
if strsize=-1 {
fileflag = FALSE
}
else {
fileflag = TRUE
}
/* フォルダ存在チェック */
dirflag = isdir(p1)
/* チェック結果とオプション指定に従って処理対象を決定 */
if fileflag&dirflag { // フォルダもフォルダも存在する
if p2 { // ファイル優先指定
flag = TRUE // ファイルを処理対象に指定
goto *@f
}
else {
flag = FALSE // フォルダを処理対象に指定
goto *@f
}
}
else {
if fileflag {
flag = TRUE // ファイルを処理対象に指定
goto *@f
}
if dirflag {
flag = FALSE // フォルダを処理対象に指定
goto *@f
}
return UNLHA_CMP_ERR
}
*@
/* UNLHAコマンドラインを生成 */
cmd = "a"
if flag { // 処理対象はファイル
sw = ""
}
else { // 処理対象はフォルダ
sw = "-d1"
}
lzhpath = getpath(p1, 1) // 拡張子を除く
lzhpath += LHA_EXT // 生成するLHA形式ファイルのパス
if instr(lzhpath, 0, " ")>-1 {
lzhpath = "\"" + lzhpath + "\""
}
dir = getpath(p1, 32) // ディレクトリ情報
name = getpath(p1, 8) // 名前のみ
if instr(dir, 0, " ")>-1 {
dir = "\"" + dir + "\""
}
if instr(name, 0, " ")>-1 {
name = "\"" + name + "\""
}
cmdline = cmd + " " + sw + " " + lzhpath + " " + dir + " " + name
/* 圧縮 */
buf = ""
return Unlha(NULL,cmdline,buf)
#defcfunc unlha_ext str p1, int p2
_path = p1
ext = getpath(_path, 2) // 拡張子を取得
if ext!LHA_EXT {
return UNLHA_EXT_ERR // 中止
}
/* UNLHAコマンドラインを生成 */
if p2 { // lzhファイルと同じ名前のフォルダを作って
// その中に展開
/* 展開先フォルダを取得 */
_dir = getpath(_path, 1) // 拡張子を除く
/* 展開先フォルダがなければ作成 */
pdir = getpath(_dir, 32) // ディレクトリ情報
name = getpath(_dir, 8) // 名前のみ
chdir pdir
dirlist buf, "*.*", 5 // ディレクトリのみリスト
flag = FALSE
notesel buf
repeat notemax
sdim linestr, MAX_PATH
noteget linestr, cnt
if linestr=name {
flag = TRUE
}
loop
if flag=FALSE { // 展開先フォルダがない
mkdir _dir
}
_dir += "\\"
}
else { // 同じフォルダに展開
/* 展開先フォルダを取得 */
_dir = getpath(_path, 32) // ディレクトリ情報
}
cmd = "x"
arc_file_name = _path
if instr(arc_file_name,0," ")>-1 {
arc_file_name = "\""+arc_file_name+"\""
}
base_dir_name = _dir
if instr(base_dir_name,0," ")>-1 {
base_dir_name = "\""+base_dir_name+"\""
}
_cmdline = cmd+" "+arc_file_name+" "+base_dir_name
/* 展開 */
buf = ""
return Unlha(NULL,_cmdline,buf)
#global
#endif
|