goo

mod_MSZip - 3 / 3

mod_MSZip - 1 / 3 - 2 / 3 - 3 / 3
mod_wv2.hsp
#ifndef MOD_WV2_HSP
#define global MOD_WV2_HSP

#uselib "wv2.dll"
#func global CreateCoreWebView2EnvironmentWithOptions     "CreateCoreWebView2EnvironmentWithOptions"     wptr,wptr,var,var
#func global CreateCoreWebView2Environment                "CreateCoreWebView2Environment"                int
#func global GetAvailableCoreWebView2BrowserVersionString "GetAvailableCoreWebView2BrowserVersionString" wptr,var
#func global CompareBrowserVersions                       "CompareBrowserVersions"                       wptr,wptr,var

#func global WV2HdlNew     "WV2HdlNew"     int,int,int // type(0:II 1:HI 2:HW 3:HB 4:H), hWnd, msg
#func global WV2HdlDel     "WV2HdlDel"     int
#func global WV2HdlWait    "WV2HdlWait"    int,int
#func global WV2HdlGet     "WV2HdlGet"     int,int
#func global WV2Env        "WV2Env"        int,int
#func global WV2Ctrl       "WV2Ctrl"       int,int
#func global WV2GetVisible "WV2GetVisible" int
#func global WV2SetVisible "WV2SetVisible" int,int
#func global WV2GetSize    "WV2GetSize"    int,var
#func global WV2SetSize    "WV2SetSize"    int,int,int,int,int
#func global WV2Navigate   "WV2Navigate"   int,wstr
#func global WV2Write      "WV2Write"      int,wstr

#endif // MOD_WV2_HSP
mod_ComCall.hsp
#ifndef MOD_COMCALL_HSP
#define global MOD_COMCALL_HSP

#uselib "ComCall.dll"
#func global ComCall    "ComCall"    int,int,var,int
#func global ComNew     "ComNew"     wstr,wstr
#func global ComDel     "ComDel"     int
#func global ComQuery   "ComQuery"   int,wstr
#func global ComAdd     "ComAdd"     int
#func global ComRelease "ComRelease" int
#func global ComAlloc   "ComAlloc"   int
#func global ComFree    "ComFree"    int
#func global ConvIID    "ConvIID"    wstr,var

#endif // MOD_COMCALL_HSP
WebView2.hから、メソッドIndex値を取得
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"

#module
#defcfunc WV2GetText var src, var dst, int idx, str s1, str s2
	dst = ""
	p1 = instr(src, idx, s1)
	if ( p1 == -1 ){ return -1 }
	p1 += idx
	p2 = p1 + strlen(s1)
	p3 = instr(src, p2, s2)
	if ( p3 == -1 ){ return -1 }
	p3 += p2 + strlen(s2)
	dst = strmid(src, p1, p3 - p1 + 1)
	return p3

#defcfunc WV2GetText2 var src, var dst, int idx, str s1
	dst = ""
	p1 = idx
	if ( s1 != "" ){
		p1 = instr(src, idx, s1)
		if ( p1 == -1 ){ return -1 }
		p1 += idx + strlen(s1)
	}
	repeat
		c1 = peek(src, p1)
		if ( c1 == 32 || c1 == 9 || c1 == 13 || c1 == 10 ){ p1++ : continue }
		break
	loop
	if ( c1 == 0 ){ return -1 }
	p2 = p1
	repeat
		c1 = peek(src, p2)
		if ( c1 == 0 || c1 == 32 || c1 == 9 || c1 == 13 || c1 == 10 ){ break }
		p2++
	loop
	dst = strmid(src, p1, p2 - p1)
	return p2
#global

	dialog "概要:WebView2.hからメソッドIndex値を取得\nファイルを選択してください", 2, "確認"
	if ( stat != 6 ){ end }
	dialog "h", 16, "Header File"
	if ( stat == 0 ){ end }
	filename = refstr
	exist filename
	if ( strsize == -1 ){ end }
	sdim src, strsize + 1
	bload filename, src, strsize
	dst = "----------------\nFile\n----------------\n"
	dst += filename + "\n\n"

	time = timeGetTime()
	
	dst += "----------------\nFunction\n----------------\n"
	p1 = 0
	sdim tmp, 1024
	repeat
		p2 = WV2GetText(src, tmp, p1, "STDAPI", ";")
		if ( p2 == -1 ){ break }
		dst += tmp + "\n"
		p1 = p2
		await
	loop
	dst += "\n----------------\nInterface\n----------------\n"
	aCnt = 0
	dim aIdx, 166
	sdim aIid, 64, 166
	sdim aIFace1, 256, 166
	sdim aIFace2, 256, 166
	repeat
		p2 = WV2GetText(src, tmp, p1, "MIDL_INTERFACE(\"", ")")
		if ( p2 == -1 ){ break }
		tmp = "\"{" + strmid(tmp, 16, strlen(tmp) - 19) + "}\""
		aIid(aCnt) = tmp
		p2 = WV2GetText2(src, tmp, p2, "")
		if ( p2 == -1 ){ break }
		aIFace1(aCnt) = tmp
		p2 = WV2GetText2(src, tmp, p2, "public")
		if ( p2 == -1 ){ break }
		aIFace2(aCnt) = tmp
		aIdx(aCnt) = p2
		aCnt++
		p1 = p2
		await
	loop
	repeat aCnt
		idx = 0
		cnt1 = cnt
		repeat aCnt
			if ( aIFace1(cnt1) == aIFace2(cnt) ){ idx++ }
		loop
		if ( idx == 0 ){ idx = aIdx(cnt) }
		else { idx = 0 }
		dst += strf("%s : %s\n\t%s\n", aIFace1(cnt), aIFace2(cnt), aIid(cnt))
		if ( idx ){
			p1 = instr(src, idx, "BEGIN_INTERFACE")
			if ( p1 == -1 ){ break }
			p1 += idx + 15
			p2 = instr(src, p1, "END_INTERFACE")
			p2 += p1
			repeat
				p1 = WV2GetText(src, tmp, p1, "DECLSPEC_XFGVIRT", ")")
				if ( p1 == -1 || p1 > p2 ){ break }
				tmp = strmid(tmp, 17, strlen(tmp) - 19)
				dst += strf("\t%d\t%s\n", cnt, tmp)
				await
			loop
		}
		dst += "\n"
		await
	loop

	time = timeGetTime() - time
	title strf("time: %dms", time)
	objmode 2 : font "consolas", 15
	mesbox dst, ginfo_winx, ginfo_winy, 5

	dialog "結果を保存しますか?", 2, "確認"
	if ( stat == 6 ){
		dialog "txt", 17, "テキストファイル"
		if ( stat == 1 ){
			bsave refstr, dst, strlen(dst)
		}
	}
	stop
コメント ( 14 ) | Trackback ( 0 )

mod_MSZip - 2 / 3

mod_MSZip - 1 / 3 - 2 / 3 - 3 / 3
サンプル wv2dll.hsp - wv2.dll等をソースコードに埋め込む
wv2.dllは、WebView2を使用するための小さなDLLです。
WebView2LoaderStatic.libをリンクしているので、別途 WebView2Loader.dllは必要ありません。
バージョンは、1.0.1518.46。
(引用 訳)WebView2 SDK バージョン 1.0.1519.0 以降は、Windows 7 および Windows 8/8.1 をサポートしなくなります。
参照 Microsoft Edge and WebView2 ending support for Windows 7 and Windows 8/8.1

実行時に、wv2.dllが無い場合は、
mod_MSZip.hsp の MSZipToCode関数を使用してソースコードに圧縮文字列化して埋め込んだwv2.dllを解凍、実行ファイルを再起動します。

#include "user32.as"
#include "kernel32.as"
#include "mod_MSZip.hsp"
#include "mod_wv2.hsp"
#include "mod_ComCall.hsp"

	wv2dll = {"ClHlwBgA3gIAZgAAAAAAAABmAAAAAAAATjYAAENL7X19fFTF1f9sskkWWNhVEg0S
JcpiUQH3JS+bl80LyYagBDYk2QUkhJBs2ISQxM0uRAuauEnL9bqWp8XWtrQFwda2
1mKLCr4uRkmiiKBWo2ibp9L20uTpE5VCqDzs73vm3s0LiO2nT3+/f35dPnNn5syZ
M2fOnDnnzNzNUrJqO4tmjKmRwmHGDjD5k8f+/kejYmzarGensf2T3rj+gGrJG9eX
e+pbk1u8zeu91RuTa6qbmpp9yevcyV5/U3J9U3LhsrLkjc217gVTp042KDRmH3jm
++vff783kpp239ZbjXzuo/19bp5/2LeJ5x/1beT5BxxOuIQ3b3d/XxOv9/emIu9/
9FhfHc/fV/ITPF9eX+OhPpebi8PO2BKVmv3StqE2AhtgUddPUU27gVlRWSDDtmTg
oacOvKrn5SjGYpU+kZztUoTKm/NUvJNe7iLncra9jrEP0droYWz/lwl7O2O9oLdv
DePsXPKpYiwR2XDlRWsHPh2qy5Nd4HO3+ZBPT1MYso7xHfkkM7Z2gbe22lfN2GvJ
ytxvQMqeiIdx8xbIaOwA0WiXZcPWXIIXWuB1NzbXyHOiuXHBrb0Eb+E/oIb//vwv
PhXCHyq78ShzOUW/VrRrxKSunWVMXybFpjIWeEUt9ARCNwufOKTseMaETxpu9uxD
s/Qur7nKpB8kYH2r7ogQCQwliX5Nj9rgKGd64ROpHM2BITUAr5RyQIEMQGnGVSCh
NoQTQg6mBygwEvYVAK4ieI9ubsx29NBdUWhQA6un0EDqzZDHk1qFE57nvZKEw9RP
J6SA0FyABm8xhQaNGK+4gunFaw8AFH6bBswGwn55JLQ+Xa7AAxfCuodCgVeSxk2C
JFGpET7xqLFzpILpNFVpaQKxhUI1Ci5HWTjhcVDjEAsgGT1+czjhMRpg5G7/V9CZ
tpMUK3e+ItLZMLFzV9h3NaCfxhOBVi0kKp1HD0whQSYmHNI9c2gqY3HtXX26pYcm
SFoPPnfPa2d6kyTYhyPs7riSRgz7NZJGHvvJeGXsHSgERqK9qbpnFkXVBUYy/TPr
AveqV/sNumfiAgO/C4ReAvSa1oRTP4SE6wK5q/2TAVit63yQEU/Fwa0nhThhkVpY
pBHOSQevwFQamNR7IRwOvKLpCum2UT9COifNpUG7UbBwRSlzSHuJr3PSbNQbVjuk
rWZSL/TyfVXolvto0HRTd6A76vjnqP1tutJxw+iE4qZzEssxsCnslO7/HxpY3Rny
20UbLbSnnVb1PUz1BWA65PX28KV+76UoyHAwSejxlFM9gfAHY16KyWPtwZKT0gUs
llgybDolCTdikJHAK/oJsjaMCfrgARCQboWshcMHj1F5NpV7Dp6k8tUoP2em9Tqj
6zwDeXSFdZ1/oTyk6/wjcsF+LFg51ENOl6aV4ICWl2F24XcJYx9Bu0nW/gEhVihS
C0VQRKlEz4UhPQVZdIZ8zcGSAel9ksth0T4k2N8RzsmEnKD0DhF7D4JdbAoFt34o
xAUr+4Vo6vETuUfJMWVUl+c0WHaGjwM5SbR/iCxBLNE6pKMYjjpIOkj6xKCi2Lpn
+jte56oY0i3tp/ZetA/Gf1GrLEvbHAzYH3jFEJGlUzi6ewSCFKcmdzB9rZgwD/MV
tfdndZAfuDdx92k0go3JTqzeXlqiKFNoTWW3hzpJ027kJilgo1rY/5YkTWZsD3WR
2/fO4e2DB5VVOzkcGFobWbhCw4rA1nim65yPFRLtekxUrNAEVxuKewq0fDGmC7er
hQJNnW5TKOgzGD7T3VukxyO2pyg5jA+W4fA0yGWLwQglfI6KSwzZ0q9QcJZJ10zn
+uzZWMn0DQYpg7OqEboxmc2f6e4pNBSLhQaHuMVQ3lNAgRPriT62AoJIHaYZn/Hd
AAa1YqxYrK7T3Vto0CvrGT6Obto6XTNAPdH70KNO926BViiIF76aKPrjhdYk3mkU
vacgmagTl+ISDFpuWFIW9hlWUJKWMuJKKxzuOuGbJkaLxZqI/h3ncxmZyjfYJ1P5
3AyShMJgzIvR2CQgtgIrumE2MIaD7tO0oi/r2aikO4a46pYbNFhiReSdhscUw7Ha
oBeihQISr/C+dC/IYsqz6gI5zDfDFF4Eq85jjjKnNOtzbk2E7sGZWCFTOFhu0Ltc
0u1qRZ77VAJ5hN92nfDfIPr1YFMvvQk1dJLW+4DboHJIr11F2ImY55m26znKdRhS
fEDm55T06A3jZtHddUK3o3s367icWuq+8UeIdPd5WTX3eQbgWRT1RH3XbjUadPq8
Yd1NhQbj7kTUpsQkEazrExVNf08yKnsMeNCqeAjBw+jx3iymd4UTkjghXVcZlEwm
9oym1NEQFU4lKuFU6hBOYORabNQvWnffTSB8JmYqKnm6ziQVxe2Ils4emx0Tz4fX
8+Gjafi+YKHBADVQb9NDlsnbrsFizIWmcwukEnYayJ2iJUkwCw8YOkkzOw3bKLyn
9XzA8ABlSww+iL3FFMpD1obqFqRaUEoWVhvWAuZBvRGpHBrgwHKuUMvdVgd3GB4m
mhQHTnmOnsIqNedWWKgVbtPwCQMxBUSMumcYMitoZgNUCDp5e6uZHnlxFdckGn7J
gW2APVe8julv6kaTlm/O1QatqyG2tHT5RKmpITW+JOJUApveEhJIhEJCIn8SrBRr
qQHaqbfhTzykBtKj1yuGhmphXRe7QC0QSAPzHK4gurvQYc95vpLU4Wa5w6n3QOJg
DFh946aI51g95jkCW7WwP3TEQqCFhakYgACE29TCbVohSnjPdOL2oP95YU0yWaBR
6wOzs2wymeNeaRHP35FykTtd0k+m8T0R9O8TrhPWqIU15Clmc5y9wgxhpVpYqZGm
U33rw8IsoUotVJHfVhHEPiDCI/murQtYme9qp0P6yVnFi/vmkP859Q3ismQoWLHP
FbTvxZZCfTDpOTIFp2gXBUv2SS4tH6vUIf1mRNm1phA2pjNY8rC0QEuuyn9L0L8X
oUkhpCYtmiLzck6apFXCg3it4uUrqI1Qpf+aosQrI1PI+7gcUlU8nyjsgaAi0qWT
+LjS4kkyH/mTZLlkTJLlZOL589JNkyJOff91siNazc2Who1zEC3C29A1w5ib8MD4
zzOFoMjal0iLb+oJbDEYyOzM1dlHRPULBlhh1PQwbMjmkeIipYDjH2v4wjx+WpbG
J1IqzeWQ6S1y8NKfZRvWia3+3Sgeml2lNC/k7a+Ntd+FdkULsJd2a77ENsUCVZyq
RhsixM6H5Bg5m/aE6YzgM1hlCw8jkO1w4pnnaFCFj1OMWo9pYfHXydOgnVWIVIzZ
54G1E3E8PAEBKW8yDzrmiak0CsxpnlQ5ma/fJ+OIl0WII47x3cKxfgoaIjYmCRQk
v0dVSDEvMBKj69qFPXXqSRX3NHmSFgTBTzbzvYqI/nCS6QQZ8/Cm01Ln3EigqC0I
HE7Jgm3wfjz4I/jU2DpddcyuUnKJ5DHrdC2hmbLAaFDh/fCmIUmNFVFmNDOOj7VC
+EAi0QW2arAZn2U0N13nr7i6axp0Unkcd1kQxXKkpaOrkAf65JcRd0OsspfGTr2H
n02IfZK7BgvKpPe+Qixzm67COsjeu46CAEQdGi4naQOGeZFMcMPkhikAFTsw4SRp
51jXwxAQ0D0+qJuk1XD+5L5h9F3qPzzo7KRAZZ6u80dAHSz2kJpIp5IU26WRbdcA
WbUHV5DR2knhcNuKUe+1h9ZT7lUv9zr1q/+hQbVdfT5tOOWFbIpoD8Vyuc2TPoBh
M50Z1Hv+UhGJoF+kqBqhgQd7zDFzvFMdDZzFSv2YBUTcUYlpvOjiBxqfU9yqxRFo
GQ+5KgYg5ygk+zFpBQTDkaB3pmDFMVgKO18p32xTH9yA6a3bRF/wWIYvOLD5Ju+c
/MA5tf8vODVdK8cqfM+HriF+lODzZS0TjgnRYP/3Ec7ihfeEkpNjvAXtQz38TPxr
lenMk6ozh1T+ST3qZwgyaBdKBrZVDjZMBpJDrDxZJp2bI4dS6mcQgWf0+xKgoFfA
mi7wTwmEogT7SbFkYHCaqa/rzP2Vg/6YLPtJnz5wITpYpNJ9s5sOrWr/D8683f6x
SmZ2+jWygYqPCM8UgklwOByS8a/hcOXLajJZERfkGXVBXSH/lRHoE6PQ0XOsfS64
ahb9yWJForg1/v5KinoD51Q+LLB/njzbQYPu6dfzO088y7AXdfbjgh7IQptGcGjF
kiShGId2oSVeLE7GehnENoPwtrzpdU/bEbz4DQi8kmC+4h1hv5ZisONc3AbFxHYM
GcjUvTcWFELQXRLppAYNnjBdJ0mbDFyYPV3voIFOscGuYyj1MDJjB4HXftM5h2dG
VBTm6SwNJ2gxSdMJ2iR0zRbk3RzBF4isq6zMsw/shZ8iCuEEPR2iD0dq8SSzM/4N
gReoS/RzJABvFc7RdPLuj+ZGuSNGPqGemB0xPNlCT6AniivpQ/3oR3oKjfw1itDI
66DQkE2sS/oOCASDhCF8Kl3LT3I4v5yQV9iUSCvc8QrJI7LILqfwrikkbrdiT2bE
qzZP9k4PhNSBEb1/0Cn9/C/8eDtoUA63xSuUw+2A+uLDLc5IVZxg2K+Xl0H6iYqL
lBQfcJx0xIUaG0Rwr08bLFYN6568TeMfGow5SCChlxTsCGdI3KoRFymYtmBLGJib
gQmhpYhxYos+YvOFc2TqRRsdX0xnsIkT0Bw5T7jCx3FsuECkh8GZrL1802nobmWr
ZpxFONM2Hyaixz5EawH7sBLnEoVMcOuQy3NyBT+f4Nw6Cx0Hs8VFyV2he44UC4uS
xWVa0YXBNieGN8dLd35G8tJ2he5aBOR7k4gfrUwIWuMavBUrMQFa5gSfIs3Nl6CM
T2cpzdjRiy9c21XkEKAJih05Is9FOAp2elR0JBNXJoHxhJ6iJE5jwrmqp4hOeyEI
aJJTsmvlO7VhTopLRTdFoSeW6EW7toff1YqJYptabNGIDi3CqfguLGvHhRAa/JqO
vyEr8s05EAVD1/G5YLl/qX9+R7i/763b/XM6Ljz91JXL/Nd2/O0vjYdK/AmiXyOY
Jp4PSVVk5RN6TX2CRihWC8Waym7iovIUjU4lp8JHPqn/LOFoXc9o7QqHdM8UPg3E
SEUaoUi9Ru5NEqGwVpgmLFULSzV0aRhHm2B4zZgGwHhq9qkyVqpbawKfh30rhKPB
AlVQOzNwKAo2HTt68fHlUpxMX5zW1QcNgWbdo1H1AaMUsaArmev1oEZm6R4NSdYl
DU6Wu9iHiac1ahDn13rqMUkrSwb8KS5pbrJ8VRCFSXzicEl0/TyqqTKmdrwMYvhw
6JtFlsIY5jvfElTnOsjmbdJIL83ifIlF6owRr07IEZdyo1DXo76LsYwR3bdCg7H7
VPw6o4oiUJLYpQPIkqRr2FJ1xsugoxIXR+jkg87LoDO2V8fNZ8WsL5kP7TxEO76l
6FCpFTNUv/Pm0jTqL8jTEGNVoWjo6QkKQx3S6ev+/lTga6P2qZRomq8+lFe8IuPl
TVN0z/g14LpOSMkHv98JrVECbszquITo5bP/kR0an2m+muuiqJJnHshguh0hRQr5
mrEwYtxF5279l0TDf6ZqpSZg06KZ+TKF9z0BCsnuIaP8viRg4YL+ISFW5AiAfIsO
j92R+7MyJ785uxskdid+yTCvU3VqPA+6ffagX+rhL35Gd5nQ0xVqK0EI6pekDu4m
/KPXZCMdb0auyUbQHk4oRJ/B5Je2q+PaB2cgmiiGQ8EqoJuprzP0UjjM2nX2c7Ix
GrxCvp3U8l3sIVFIZ69UIj69HPGdp9PqVStHI77T4yI+mrXca7Pc69RRwqa5Sr+M
0EmU6cyEaKSrMa09NFEZJ1/pFUavcRGJd9VYROKb5rl/1eiIlTgSji1jPLmX8bfW
phMH14LTZ414NKhgkaUmfkelDxzWBhepD75CjT/Go6wMh9TlchuCMCHxkjvSm+jm
qEd78GYM/uwIdXE5KVyTkuReQEn8nKJbkuMePcHiJ4SqGqFi6P7KeNGuB2PY/7Ce
nSd8cYdj5oJblatUmhmrHNB8C+D+V5JKxQa2DuMY8TV+wev7KoJ5hDMfzeQbyNQX
GFHpdhwarOs84Z/UbiMyzLfmIHZ9u7RaDmcnKdQHp/Mwh0e5jxAEbSkcJFYMhf3D
Lqd0t3x5B1WayUmgQXFKp/jlSB8ZP40CGpvUOFmH4FCFOJdnBotiDs+vICcllkKA
lB4JjnQ7umURtevkkHQiPSNFza+MI3pmKd0vW4RWtdBKl3uPnAuHy6TC8zx4CZYc
EUzCnWrhTo2EPRYOVp4ch7qZUBuY9LU/KncPbfPpLp6hLwVgq65RAjC/hsCnaH1D
USDpkOb/DQceQI9IT6FErTbQ6rHz97uwiFV1gVzmWzluOJeUeo2s3qGbhfcd0u3n
yCBwIUi//BuVXdJPeC61f04ke0sbVFjMsP+ViIzQ9N5IOIxw4UbTCRq7b4QQ+6VD
IxG1WjJNlpmRy0zWIcKYzxWvV3gZnhxLuUReyl+rsJipRGnqxPZ5o0t9NaDPau6g
625qmK5c4HaH/b3ygp1qDfOdqBxp3hXeFHmUD2sr2AcmnLzKcdyBDpQMCapghdQT
RaZseamjQe90uMIJifLmXSycEz4N+0+K/gGnVMMiCr9QjEXjclm//yeRcwHtHrxO
nnc5vzgWPlW21KmbqePWIWh/SPd0SIj+tWosEJ47dfxRB47ko8hRIV4+KgTpyDre
RASfGj0wlDmlxfLowa6T/IhAxwWHs6whylUWfmqAR/mJfLmgN9fSClRqhHPykcMh
/fUsVvic9ENa/Ohxur5DKwfn8VEXvc3U4NgEnxlMmSmcc0pWdN9m/4yKFaQJJxDA
9BebwoJ9CDZb93RKRvtWPRM+19n7g+qZwieHTql1LwraO8jsI5qMdyyXjpPOqGfm
oRb4o0734rfl1rfQ9DSpkX1oUSAU9v7ifvtnF2+9+DGZUNCR8LC8YllCj+faO8Zd
Ses6v0Nh1yHRn3R/pTZyWuvGQS0R5zQokoPC6VMfcYcl+6ThjqMRnzQcrBwSLPxt
38C4t32v4xjqwo5Ql0kD/IWfXryWn0BuXE1vUoGxGOw7wm97nucA4vBtz5WRxh+i
+6n7Ljci7LmRRqwcGPeWYOVfyTpgRG7EN8iDem6jvcDPPkB59ywNyWu7OTN8vGNo
WfBX8oGr+f26clEfh+IOFOUVf2SyfDsga2EkBrfD2jwXizMVVhABTTCb4eBnOpPR
sykRvYtLOaGprjKHcFh6I0Hei8MyhSMRGpUaU8hBr3i3y+PeIvTwA6ZDOneax1vX
wBMlgXNXBInaYs7AokUp0fmR0U+FCOuvaYDY8hx8iQ3y+f5i8D4OtoR6VEcqQTBf
I+RrhXwU4oX8RCE/STzUk087hXUH7tIzGcs3KXynXn5rTgTh97Bl4g7QtcvgVOiz
oCkVVWGH2hLip0jC0OB4OhxmIuORpTjkhH1zBd4MB4vUw7pD1mUBK/OXnylKivJN
FZfGU9QoqkrDDg1AagIlTgBpfLrAPYkMfGxKlMOgQF08E48G6hKZVI6d3JDslNw4
jq9cKfZUrRkd8xOX+LfAPVrmS4YQXIi+w5ug5r2YB4jCaK/Q2RV0YqWMLMA98cKa
RN9kuIZYEYrgUHOOJmMHx4rRZXJd48vg7Fg4OykgF1Tb6Y2FQ156sR/oOjRi2bJp
2dYkDsb1FMXTO+TwJkhyHoB30K2EH7wfIPApKsk8W/pcGUu1/oKMpXp/DoVBdq3g
TBKWahG9gC1S1COywiQL92gHr/JEs1msQVUKF22lwYqoKcYSyhuMsoSq5KBaHAoM
JVlCZSAvfpBRpPXHZBTp/YCsuaOvO2g/Ccb7aRq89A5KllCDyuFwyIBj8gXSe2Wc
eSNtjV6szxQIsONcFJTF95Yl1NUHGz74S65werFCC72QNl+gCF5WiRINvUut0DqE
0mQh3yDdMbGtQtvA0CIVcrBG0SKn5YzrlsPy7WtAUuk6H5ALvnX0yCBQVx/djRqk
zxEMiCMr6S06XcWJb0pXk9mPO1DJfaLlLWEztEC78NQ3CX+u9PoY/tdl/D+dJ/wt
tC02GwZfb0iWfhLB8a1Hew9qoNQT9yEnqW2YNFgMpPtGkRYC6ZEI0nYFKWZwNpAq
R5GuBdLWCNJeBSl2lRSmC9WzVeLhNWNS6erzY1MNKhtBUesxOElNSh4nMP6mGisT
Iy6Mx4mwRC+XEwWVQtMJVt6iEGJ4JaKTapd4VPoEVUu4J5b4dbkaYlZJfnDidCnX
Qx8MwH0hkmy4bhWQ6SaLDJt4T+LYDhFjnWKexpZtZHp/nKQ7T/YpfAwbkRQwon9l
WErxt66MSo1f73RKLRAA3yZtQqUGTNk+Hy/pStScTvAii1H6+Dy/4SaeuCi0EY7e
lK6PcLQ5ETOKBS/EUZxrHEdbP5c54nt4Slm4VCMelvfGHaOCI6ldJSLc0SxX6Gsy
7BrdQyFCvETw0yOM6C192MaFkPuh8aQ40rQIUvzZ/pmhvLH2wJDe6VKQbiXn4R+m
d35Detog5wX7adEeL9hHRHuiYD8vqh4tffTRR8OORE6lak3fy/FEpxS7I1hxPuA+
z5zLRY0jXForDnedQRxoP4+BHaImXBovDqPGixps0DNrsEP7ZDb+ke6Jl+9OmrEb
sdFK7mHO2DUqWJae2GPwo77JDVqn1I/1hTE+HLHFmGZAgsWkbZtMjyvowa2UUSqL
o28PSPORIQgcnMUvJzUSfY9r5aA+gEgJC4EWh6SFsVlJutyg9+xzQzP+MJmOldJ9
6LqSXs8cpzP8XTh+bbN//GvVtso/0QwDNg8d8nVdr9LLlxiqkIeTnojlR6sS/r5U
ehH+Q/oID48HNtyzFg+peBr5FGjDTZJTRk72rKbWFdRq4K0yQTL/5hMYsMdOx+qw
ZKNz2wl/gXSI3sgM0zcYZjml78qM+uJp10dhlmKaeFSOvMLvhmOSOsj05g3q7q/8
U9j/sXSB0OGtEYrUClPpzLKyikx2Q5zUArJHIIZjJIbfTmJsN3XuCt1LalVfvIeT
Ci8Stp4kEXDvuM0+IGw9L0sjyr9BSsKUpLcR3Ute9A/M4VLi2PTlVQQNWATO8Erd
08NnfzvzzOyzgv9kZIL0xU7x8MWciVtPhv0Dkp0zLvpP8pdBxG8ojvjVekaI3wX0
wpVe6fh1GTbi9N44S+jU+2Tcab3CKt/kQDgKtqtSP2jCo8xFvJClF4fBAn1lag99
DYSDf0CWMwJ+YBR8JFrBBjn/V6Dbs8voDk7aH03XxxGNehZzWVlGXwqRGuQjYUwg
HO0vlmksHCPtS5VBhZyJQYNYMkS72+jJTuMORrGXO/i72cRu0S1ZzoxJ61JBcWef
+s5q/p6Bb4Tp5DiPKm9HFJWIOIPAVq3KHyP9Amo2NtYTPNTlV/dZUynk96u6TzVD
L17Gkt7Al1DarZYVbppnZSYEPwtLvtISogW5FcUjTpdnF47vnnl0k5PQSaFx/+rI
hRC3CFd4kirHA3xFHmsl3V3xcNlTTmVxRAmew74r6V5HsBWC3p5iPKrWQH0dDkQT
4QQfXSzN5Vrq/xM4+AVU44gydDuF5nKbL84xFmw6X6R2jPYAjT81hb6hYdfkC7zk
FDS1u/mNG79+E7XbdhNY4Jdv4YRt6LKm8hRdBhEl10tEyqWQ8muwJf26wLTw4E0N
tfwEu3JwKJAT9n1yeZoumSiiqm4sHs0PArnCYyDE0W28pjucOpdPiuK8SHkLMaOs
eqHccQbt/6NcAJxEhMCgITJpGozvwwiVNseoMNZw29sQ9pyxM33tbv4d7tIyp4sf
/iyvInY7XbuHf1/NTcdAvq/f/QzaPqg58HYWpEtm5fQEnYycJHCEDLhPM1AIuEco
qq0lidlHLPbTcEnhBA+9VqNCo1ygg1c4oYUjDQdLzlvsQxb7ecshmAOulxD90j/m
Pfci/elA1ps+dddR/43SDtoWvVlv+uMOLkPj4DRAJ0+9YhFjhwb0U3oF3vPs8Sph
qrFdER3fBVcGbLRrmH8S3ydrebSaR5vA4+AyWk2qw8vSGg2ZoQMrUO4+sJae0n/T
sMXqgMYgFKulP0VqUah1K0GnWJwd3at7Jj8+WJoYfQyF2A3Dc6M/zXrXNwMhVtZt
Wu9kcaEmeqE2q9erDbw8N+td/58p0ukWXx7Eif+lOH7Hl1y7mzzYi42kHA71oDrr
mA+ciq8N656chh0wbA6t6d6nWtMtPSh3kDfEYKJ0dxy96+wnEwpwtDnULR1HZZ+q
Gxv6GL8PXAn71S39Lo5/dYZjvC2X46TXyJv+F5C5yZWek3tiatKNfBz/DC5Gbm1K
4h1jxqYCTikJZ39pBbf5ld3SX2M5Y1qPj4RZxW26tDFO/o7q6jgy7ExaReBT9G0I
vkIa5o87HNNCPlb6iHxLpsyY2hwCxflyZTL63UD9Bk/tU3E9brfdyS/i1VSn0yL2
R0zggsq/TmqWubgRxugGmZO+WC4av87TTtVn5arvFnNo0BjoCwtTCUuY2safW/iz
nT87+XMbnodjaDwV5F/Z3RAj3aAi76TxtNSB3vYo2Q8dKFnFWF0GfU1L76/cnY2s
g76Upac/AvEvOThFRc3bEqk5B4pzkNpuOeQo5XEyxQ2+rwTaDGzL9YoX2KcanCXa
h0Rm6euwgmxIt+OQeIh8hYJgDn2Bm5CaYrgAdO0k3EmW0EFSqa9H5NbC5RbbvlXL
/FdyNxnDuOs+xA/EinwDNpIJTh0aqMj3Sc+myLIMENbZ/pUzQ2ePzbZrIlcGUi/Y
kcH9xZXdB/Z3yva4Y8gA/1nWcHU4YYl8Co1BSPvGTQ3R0jmKrtSGI1H0pv1DupuF
Fr+ili8/uh6gW/DgNno+1EnPH7TT86kt9HyhDc+6Bx7ay7Pgwzz7gY9nXS08e7SR
Z7/wINv5ja6d5JntaqFrBwpBKuyi4x4fV8VUTMw73+AQurbz1seIk0w1fZ1OTV8f
sD+WwFhej/1xFf+e9f5wwgpuaIMrwmdPAB3RtzyDa07A3l3oxgbhp+MRWLly+TCs
RWynwaTJK6zEOgXmPEDr0F3mfHEHIpzn6JH1WesMl5gDrzhZfFPZZO8FDquzPvOe
wuIS7k7C3fkP4HpezYeVD6fyF4GFBr3QaNAHkW4ZiJh82GFYfcEthf04O5xXNIqm
Yh+WHUG3chETTpN+Hk06Ei/EytGE0/OjDDghIiMZo2nFkhT3wuS5cytBU/dMUrNQ
OKFYvk0qjFwyyWoxXisaola+cdOe7ffRhnuAngnb6HltJz1T2+lp24Jn3QMJj/Fs
6k6eXdvGsxgfz+a08Gx+I7Kd34jZdR+5GLZnB8/Vex6+j5ZFs2cv1fmK9cQM8PBe
xXZT456dqPXEbMeTGO+J2aEE/z0xu5RSg3rFhhDrad+rRPFyXXZcwpKYEdQPDaBu
VOqeFjqS0t0m352BOY93Utg8ZAhMzaM3NA2TI0LQdZKCBdzDjK5eXJa+4NYPy3SP
iJ/dsV2IEzarhWUaS5/g0or2D8WtAzj4dZxd5G7yi3Yptb7JvZhOf/aTqU0+dyNW
ET5O6Rus/FCIxgpPsY9M6aGXFrdrhDKtvwBk5gznhnW2UKyK+Wbb1sZGMV+SrYWy
BJsjNpr5pgGILA7AaOa/QrTtA++BN1UCLwzGygCx5GRD3Aqh5HyG/fQWo6Vv/Ljy
eGLJeQwpVg6c7aY/3PJNC7wZpdCIFiuHd5MgAr1RPTEkGxLyHoKcPUR/Oqbr/BbF
+b1quTVqfCvT+O7iud53p6VPpzom2IeEimGymSXDDbFrZh/OOux3KeQ1MoHoCIEz
3cm+rEBvsgyOiYBhsaOPze7P6vdfBzrPDvAv8A3PfjnrZf9UecnyhFTqgW1mCfUh
LMpDyogppK9Gw8uG5wzRBpgj8edp/hzmzwH+PMmfI/xppW07J5s/GX+q+TORP+fx
p5Y/9fwZz59G/kziz2T+NPDnXDzhuhGu04k9YOPC3FLXsVWzP4qFfJNQeAoFf7nu
iUqoyvnAcO5jHb7cn6ohU3/cgQfhYPq6f8ov6G7+qUbNgf8hA/UaXvuWXEvWozbt
wDd47cB2nsGf9XVv3y6WGzTBhVrxtiFLr/RthI8HiuEi+Wvdf/9R3P9Hn+wWxpYj
eZDuRrof6YdIjyPNa5FxXsMJ+nmkfUjfQ3oQaQsSnazfRUoEnhpJagYu0hNI30Pq
RPIgLUWyIt2ApEEaaWJsAOktpGeRvol0N9I6pGKkTKSbka5CUiN9upGx3yMdQWrB
eE8j34X0TaQtG2UeizagH9JVSDciRW2Q4QeQH0V6GOlBpCeQHkH6i9JubIQMGuXy
WuRepAeQipBeQ/oj0gUkLcZZjvwJBfca5Aal7AOtdQq9X2RE/rp37LPvC2CX+1wP
1DilHP0F7Xa2kLmYm61jTlaPfPMXwlazNmZlacjtbCPgblaLf/RcyLysGRitqHkv
6rUA7Y2MJvVVVsQszMhMLJ2Z8S+NzQfEjlI+SinIM1gqSlbQK0TLfOAaWQH65KMl
H73swCoAzlZOzYxyIbDzOV468O2gbQUuUTMiL0Qpn+NZUSIaRWixcz4KOBf5+CdT
MwI7Fc+FnKcC4BP1NIW3It6baKRxHubz/ikYLw3YxGEBeprQX6aWBlrEeSqHpgA/
DXUT54h60fzn814pXA7pHMuKegHnm0bJAFSmthBjpKJuB0YRp2Hk88xXqJmAQdQs
yI28NZWPlcElRvK2cskQtauWIzRE+hUSK2P6pfR3uVi9OubDalVj/dxY4RKsXg1f
1ValjVa9lq1HawVrQakaMMIswNrSSjehXoYUgdOHdIQgjOvJJuQ1qDXxUe5CrZ73
Ip0hmKz49J5Ug3Ql0jVIc5GImsu9zlnv3mzOTC6qrm901yb7mpPr6puQe9zJ1S0t
ye42d3JLtc+zYPKX40Yak2sa691NOHk3NiZX+zKT2WS2yO0rAr7T7W2tb25a3FTX
XFZ/t9v1BXAXQ6XU7/be5axu9AMFM6bZe/mc1mOV6jEfN1uMWh0kuBprIusk5bRK
q5mDy7eW+SEVH/YLyaEV/ZpZk/z38ePm0bqhvqUFE6lvqq6pcbe21q9rdCdDZi3A
n4/d2IrnZj72fFBr5qs4HxIfT3M+ODLhaeIaMrYvJ2KNwfOhQU48HZiFBfo61mLf
BMEtd6+vb/W5vZeXdjX9QEOrr7qRgKNi9/qbfPUb3cnN3uSm5qb5aKe5lNTXeJtb
m+t8yfba9e5Iv2of5I0F/QJ9XHCRnTGz5ZAk6VM95OFGu6yN6/g6VEH7NyPfAL1b
h9nUor4O/wj2z1FfqOj2v55yId8r/3q6BeP23r+e+uKL9vKXjwC/50S8ijTZxfTr
kEJITsUfeaLk/FL95ypV07wRG51vgU3ylkyWf0oD+7TA7/VCOR3VNRuq17tpq4ID
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
ed0yYglb5qYUpbSm3JWyPWVnymMpT6d0p/SmfJxSmrol9b7U76c+kfpaalSaM21y
uj79lvSU9Kz0wvTl6SvS3ekN6a3pbelb0zvT/yP9h+l703+Wvi/9hfTj6e+l32fd
bX3K+qz1HesH1gHrH6yD1s+s56xha1zGFRmzMswZ1gxbxsKM2gxP5uSslKwfZz2e
1Zt1MmtBdn72oew9tjdsJ2x/sv2X7VPbOdsFW3TOdTmpOVk5dTlRuU/lPpf7eu7x
XHpp/yHmnWbcYHza+Bvjfxr/2/g1049NPzc9ZwqZUs355uXmNvN3zY+Yf28eMV9l
ybessvzZ8rO0/WnPpr2f9re0Kekz069Pt6U70jeC+5fS30h/P/136SfTB9OH0/+a
HmdNsN5ovcW6yFpidVorrZutAes26y7ro9a3rf3WORmNGYGMhzI+zvg8IypTm2nN
ZFk3Zj2a9ULWQNbk7O9l/ya71naf7Qnb87Ye21HbSZsqx5azMKcspyqnNefJnGdy
Xs15LefNnI9yTub8d0587vzc1bkduT/LfTL3UG5v7lu5I7l0fU2H8GijaHzdeI1p
rslqKjEFTY+a/tM0aDpvmmw+aD5l1lpMFqflPy03pLSl7E+Zk/bNtBfTXk8bSvsE
66RLT0pfk16X/t30PelPph/BvBZb77Bek+HKuDNjd8bLGb/L+EPGnzOGwb8K/E/P
TMy8PvPWzJTMwszFmasy12a6M1sy787syPx65n9k7sp8LHN/5quZRzJPZ57PnJQV
n3Vt1pysW7NSs7Ky8rNKsu7IWptVl9WctSmrI+vrWQ9mfT/r51lHsy5kTc2+Knt2
dkZ2a/aW7GD2d7Mfzf559pPZL2R3Z2fafotVvTVnXc62nO/kPJGzP+fZnFDO4Zwj
OW/l/CnnfE507qTcmblzcoO538t9OfedXLpDfZ4fZqYbf2cMGyeZbjDdYjKaCkwu
02pTs6nD9EPTgOkPps9NarPOfJX5JnO62WYuMC82LzNXmFeba8wN5juhDfeav2Z+
0Pxt8w/NPzP/2nzA/KK51/wW9ONTc5RlimWmZY5lgeU9y4BFshhSFqSkp+SlVKSs
SQmmfDvlRym/wK7oT/ldyqcp51OiUjWp01LjU69JTU69MXVeqjnVmpqTWph6W6oj
1Zm6OnVdqie1KdWX2pk6OY3OpfTOxmGqNe207LLstTxmedySDdqFKcUpS1IM1rnW
eVajNcW6z7rfesD6vDVkPYZd02/9EPvmSPax7Babz9Zm22Jrt3XattkesG237bA9
bNtp22Xba3vM9rhtn22/7QB0LWR7xdZrO2I7ZnvH1m/70DYAzZNs83KMOdac7TmP
5bBcda4mV5tryJ2ba83Nzi2E3q3NbcvdktuZuzN3V+7e3AO5z+eGcl/J7c/9MHcg
9zRpIv8/HehorTfGG+cZs415Roex3LjCuNrYYvTB2uww7jXuNx4wPm98x3jSKMHi
nDfGmxJNSabeVCn1dKo2TZ+WnFaY5khbkdaZti2NbsLoblRtLDauNbYZtxsfM4aM
/cZ/G/J/7vN/AA=="}

	ComCalldll = {"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
tZyzXLD86YXT/wI="}

	restart = 0
	msg = "%s の読み込みに失敗しました\nカレントフォルダに作成しますか?"
	if ( varptr(WV2Env) == 0 ){
		dialog strf(msg, "wv2.dll"), 2, "確認"
		if ( stat != 6 ){ end }
		MSZipFromCode wv2dll, dst
		dstSize = stat
		bsave "wv2.dll", dst, dstSize
		restart++
	}
	if ( varptr(ComCall) == 0 ){
		dialog strf(msg, "ComCall.dll"), 2, "確認"
		if ( stat != 6 ){ end }
		MSZipFromCode ComCalldll, dst
		dstSize = stat
		bsave "ComCall.dll", dst, dstSize
		restart++
	}
	if ( restart ){
		dialog "アプリを再起動します。\nよろしいですか?", 2, "確認"
		if ( stat != 6 ){ end }
		GetCommandLineW
		dupptr dp, stat, 1024, 2
		exec cnvwtos(dp)
		end
	}

	oncmd gosub *WM_CLOSE, 0x0010
	oncmd gosub *WV2_RESRECV, 0x8000

	WV2Env 0, 0
	env = stat
	if ( env ){
		WV2Ctrl env, hwnd
		ctrl = stat
		if ( stat ){
			// 25 get_CoreWebView2
			prm = varptr(web)
			ComCall ctrl, 25, prm, 1
			ComQuery web, "{A0D6DF20-3B92-416D-AA0C-437A9C727857}"
			web2 = stat
			if ( web2 ){
				// type(0:II 1:HI 2:HW 3:HB 4:H), hWnd, msg
				WV2HdlNew 0, hwnd, 0x8000
				resRecvHdl = stat
				// 61 add_WebResourceResponseReceived
				dim token, 2
				prm = resRecvHdl, varptr(token)
				ComCall web2, 61, prm, 2
				ComDel web2
			}

			WV2SetVisible ctrl, 1
			WV2SetSize ctrl, 0, 0, ginfo_winx, ginfo_winy * 4 / 5
			surl = "https://www.yahoo.co.jp"
			WV2Navigate ctrl, surl
			mb = ""
			pos 0, ginfo_winy * 4 / 5
			objmode 2
			font "consolas", 12
			mesbox mb, ginfo_winx, ginfo_winy / 5, 4, 0
			hmb = objinfo_hwnd(stat)
		}
	}
	stop

*WV2_RESRECV
	if ( lparam == 0 ){ return }
	// 3 get_Request
	prm = varptr(req)
	ComCall lparam, 3, prm, 1
	if ( stat == 0 ){
		// 3 get_Uri
		prm = varptr(uri)
		ComCall req, 3, prm, 1
		// 5 get_Method
		prm = varptr(method)
		ComCall req, 5, prm, 1
		dupptr dpUri, uri, 4096, 2
		dupptr dpMethod, method, 4096, 2
		stime = strf("%02d:%02d:%02d ", gettime(4), gettime(5), gettime(6))
		mb = strf("%s[%s] %s\n", stime, cnvwtos(dpMethod), cnvwtos(dpUri)) + mb
		sendmsg hmb, 0x000c, 0, varptr(mb)
		ComFree uri
		ComFree method
		ComDel req
		await
	}
	return

*WM_CLOSE
	if ( resRecvHdl ){
		// 62 remove_WebResourceResponseReceived
		prm = token(0), token(1)
		ComCall web, 62, prm, 2
	}
	if ( web ){ ComDel web }
	if ( ctrl ){ ComDel ctrl }
	if ( env ){ ComDel env }
	end
コメント ( 0 ) | Trackback ( 0 )

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 )