goo

mod_MSZip - 1 / 3

mod_MSZip - 1 / 3 - 2 / 3 - 3 / 3
mod_MSZip
mod_MSZip.hspは、Cabinet.dllを使用した圧縮解凍モジュールです。
mod_MSZip.hsp
#ifndef MOD_MSZIP_HSP
#define global MOD_MSZIP_HSP

#include "kernel32.as"

#module mod_MSZip

#uselib "Cabinet.dll"
#func global CreateCompressor   "CreateCompressor"   int,int,var
#func global CloseCompressor    "CloseCompressor"    int
#func global Compress           "Compress"           int,var,int,int,int,var
#func global CreateDecompressor "CreateDecompressor" int,int,var
#func global CloseDecompressor  "CloseDecompressor"  int
#func global Decompress         "Decompress"         int,var,int,int,int,var

#uselib "Crypt32.dll"
#func global CryptBinaryToString "CryptBinaryToStringA" var,int,int,int,var
#func global CryptStringToBinary "CryptStringToBinaryA" sptr,int,int,int,var,int,int

#deffunc MSZipComp int size, var src, var dst
	ds = 0
	if ( size ){ ss = size } else { ss = varsize(src) }
	CreateCompressor 2, 0, hComp
	if ( stat ){
		Compress hComp, src, ss, 0, 0, ds
		GetLastError
		if ( stat == 122 ){
			sdim buf, ds
			Compress hComp, src, ss, varptr(buf), ds, ds
			if ( stat ){ sdim dst, ds : memcpy dst, buf, ds }
			else { ds = 0 }
			buf = 0
		}
		CloseCompressor hComp
	}
	return ds

#deffunc MSZipDecomp  int size, var src, var dst
	ds = 0
	if ( size ){ ss = size } else { ss = varsize(src) }
	CreateDecompressor 2, 0, hComp
	if ( stat ){
		Decompress hComp, src, ss, 0, 0, ds
		GetLastError
		if ( stat == 122 ){
			sdim buf, ds
			Decompress hComp, src, ss, varptr(buf), ds, ds
			if ( stat ){ sdim dst, ds : memcpy dst, buf, ds }
			else { ds = 0 }
			buf = 0
		}
		CloseDecompressor hComp
	}
	return ds

#deffunc MSZipCompFile str src, str dst
	exist src
	if ( strsize == -1 ){ return 0 }
	ss = strsize : sdim s, ss : bload src, s, ss
	MSZipComp ss, s, d : ds = stat
	if ( ds ){ bsave dst, d, ds }
	s = 0 : d = 0
	return ds

#deffunc MSZipDecompFile str src, str dst
	exist src
	if ( strsize == -1 ){ return 0 }
	ss = strsize : sdim s, ss : bload src, s, ss
	MSZipDecomp ss, s, d : ds = stat
	if ( ds ){ bsave dst, d, ds }
	s = 0 : d = 0
	return ds

#deffunc MSZipToCode int size, var src, var dst
	if ( size ){ ss = size } else { ss = varsize(src) }
	MSZipComp ss, src, d
	if ( ds == 0 ){ return 0 }
	ss = 0
	CryptBinaryToString d, ds, 1, 0, ss
	if ( stat ){
		sdim dst, ss
		CryptBinaryToString d, ds, 1, varptr(dst), ss
		if ( stat == 0 ){ ss = 0 }
	}
	d = 0
	if ( ss == 0 ){ return 0 }
	return ss - 1

#deffunc MSZipFromCode str src, var dst
	CryptStringToBinary src, 0, 1, 0, ds, 0, 0
	if ( stat == 0 ){ return 0 }
	sdim d, ds
	CryptStringToBinary src, 0, 1, varptr(d), ds, 0, 0
	if ( stat ){ MSZipDecomp ds, d, dst }
	d = 0
	return ds

#global

#endif // MOD_MSZIP_HSP


サンプル
#include "mod_MSZip.hsp"
#include "shell32.as"

	title "sample - mod_MSZip.hsp ( ファイルドロップ可 )"
	objmode 2 : font "consolas", 14
	oncmd gosub *DROPFILES, 0x0233
	DragAcceptFiles hwnd, 1

	x = ginfo_winx / 2
	objsize x, 32
	strBtn = "圧縮", "解凍"
	pos 0, 0 : button gosub strBtn(0), *LB_COMP
	pos x, 0 : button gosub strBtn(1), *LB_DECOMP

	sdim mb, 1024 * 64
	pos 0, 32 : mesbox mb, ginfo_winx, ginfo_winy - 32 : idmb = stat
	stop

*LB_COMP
*LB_DECOMP
	type = stat
	dialog , 16
	if ( stat != 1 ){ return -1 }
	filename = refstr
*LB_COMP2
*LB_DECOMP2
	ret = 0
	exist filename
	size = strsize
	if ( size == -1 ){
		mbtmp = strf("%s ファイルが存在しません\n", filename)
		ret = -1
	}
	else {
		sdim src, size + 1
		bload filename, src, size
		if ( type ){ MSZipDecomp size, src, dst }
		else { MSZipComp size, src, dst }
		dstSize = stat
		if ( dstSize ){
			dialog , 17
			if ( stat == 1 ){
				bsave refstr, dst, dstSize
			}
			f = 1.0 * dstSize / Size * 100
			mbtmp = strf("%s size: %dByte -> %dByte(%.2f)%% %sしました\n", filename, size, dstSize, f, strBtn(type))
			if ( type == 0 ){
				dialog "テキスト化しますか?", 2, "確認"
				if ( stat == 6 ){
					MSZipToCode size, src, dst
					mb = strf("mszip = {\"%s\"}\n", dst) + mb
					objprm idmb, mb
				}
			}
			ret = 1
		}
		else {
			mbtmp = strf("%s %sできませんでした\n", filename, strBtn(type))
		}
	}
	mb = mbtmp + mb
	objprm idmb, mb
	return ret

*DROPFILES
	sdim filename, 520
	DragQueryFile wparam, 0, varptr(filename), 520
	if ( stat ){
		exist filename
		type = 1 : gosub *LB_DECOMP2
		if ( ret == 0 ){
			type = 0 : gosub *LB_COMP2
		}
	}
	DragFinish wparam
	return
コメント ( 0 ) | Trackback ( 0 )
« WebView2 1.0.... mod_MSZip - 2... »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。