プログラミング工房 > HSP > サンプルモジュール > 

統合アーカイバプロジェクトのLZHファイル圧縮/展開(解凍)用DLL「UNLHA32.DLL」を利用する

 統合アーカイバプロジェクト:http://www.csdinc.co.jp/archiver/

 >> ダウンロード  (動作にはこちらのモジュールも必要です)

/***********************************************************


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