goo

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
mSs3uFoH3lo5vxFdps8ROMiTSNobcGZFSpk90beOb4+1M/09aF/j33hwRvQ3lz7y
7dkFzUW7z4+Nnd/S0lhfw1W3otXtLWmudTcurmXs9nF8TNxPE/2nHX7WDfn7x+lv
EdobuRX1kly4d3ZC5naUzZD1QqzHMpTLAFmOup2t4F6sgpVjBy9kS1CrApVlKBVy
HIY2ebxCbrOr/+4YFaPUC0GT6F5McTmfm1uRcQHzcI2TZ+zgNqmOUydvUcP14NJR
lqNE3Obz0apApRjlpfhH8CrQWc49uJ3nS9FO325sxVhuLs2Jkh2nEd5mMpz2Nlqc
elqkscUpZJd6QAeXBu0D0vjWv+MTV1+yP8hn0RfWjCazJSU1Ld2akb+woNBexAq8
7mqfW1Fte9Omem9z00Yw6Kr3eZa1kNa0LsYx3ttU3cguoZoJv1Cg2PeL2+yQ6ibU
vNyOb1R8cjI4rVa8US1qm7mkmlDycUsg+yuqNeNZw/duI0qybybYPxPtLUA/D1pt
8DRtkAL9JVthY2NBdVNFU2Nzde3S5s3/z+e2BM9q4C0BfB3aZUuYeRGnyfCptB88
zMb3fmIV089Ik+3B3/O3raBHmu0Z9bXmi3wtm2CNJuoqY2WNbndLQXNTbT2pgbPa
W0++saCM28LqDe58SPDiVv4zPh1MTzdZhWsROxmZ/mYk+j6Dzcz0j1dNhM0FzLj2
Ulj/RbCVgNVeBHvsC/rR+KH/xVmRbs4M1fLVDl1kTmhU/WvOo/Oqv/isVD5uvMhv
NNF1eiEOSUvWIS2d2DbtHxxvlxuyQqJ3gi2jYxgn4BRj3vOqxsanqWajXqjAqD3S
Rn+wFvn9LOrzWLt8UXZx28NYn/NrlTW5DM4Q2keqxvDGf4gu0Xh+7aXttD670C/+
Mm0htK29zJhH0NZ/mbZtF9EivIthRJdodF6G7za0t62dKMst42RL/H14UT3xIp0g
eZFstl+GT6lqIj7hSRfRXIH+bZdZN+Jv7Tj+X81n7Ixd/n2tqPao9kIck+hNcku1
DDuzEGehAsaWIt2PFFXI2Gaku5G2IrUjvYr0BtKUNMb8U2SaqdDdNtD9PsXp5S4j
Dfa1aeptt8Tc/1zslKjRH8GqYpf1RHavt9nLipfbyyqWlLOv6wr4QQnmu6jZ31TL
OqMXR6L65XIsD5Cj2uvLr3J46zeVV69vZZPV93x07UPhT3PvuDP995/s+uhhdQob
DfEXlJRRkK8MvGAJ/AGOEdOZ6ppWx7I3hfsW/XrgQ6lPvelZWodFBeVLSGK7Zo39
rtiuWxlzXqXUDRvpuMRleW3kt8cMbaO/Ubagnn48zJAqv/KWf4BigdFYU7ce61Uq
/yzZgoLl5YYVBfmEs3oibBXXvwmwxRyvdiKsgMetE2G8b+ME2BLet2UijOP5JsAc
HK9tIozjbZkAK+d47aXyz6wpMI63HbAWGLPIb6xFfstNrhvKFd/GtFGjMAr7GGyx
LCMZ1tqmdIcN5TGNAt/U3OjbSEZxW7Uytgy/m3SO6DxcTb5uAtzE75/WMR6xjYOb
ub1bp8xrDE5fLOJ2mOxxBH733bXr1tP83BF8X41hcT6Xw44JsFVcDg+Ph5XLeDsn
wGS8XRGYr7GV6nvH1el3BWHPZblQfZXcZ5+bfs8PMC4kUrqx395b4JYFR7/BR39P
rOghn6u2nrH4MZiF/x5e/QR9TeF60sDYqthRWBrfu+2QFfVV1gV+gj0WqRu8nPdh
wHpJZutaW7/ETbVHChcUO3VMySP15nTZVl2uPdU6ZuvmohyBvzMO74oMxBtI438/
8I0serss40Ty8babUnwd098Q860ZZLEMdbJNTqmbaINjLuK/f9y4i3OZfnXupbZ4
xXqZvl5JB7BeI0hWwG2QejdWYw6sxQcoN6O8G6kFq/Z15EHA7WRJkI4grbyOsW/D
LtHv1q2awdjvQOMMUjzW3Ia0FmUPUjPS3UjbkL6JtBPpx0hPIr2A1Iv0LpIW0cc0
puMSiGLR0L8YFsvioHeTEEFPYZs3mRfUNjYyl9Nc4PPyHGabMpxz6KpKKTrr+QUR
1YprGwvdjUoJTUppqXuzUnJV13Pg0upN9evhDqhcNkatbAI1l7ceGAV0/va6F3qb
N+MIpdyKtSrupKDZG7Hs5nE+5ctbx5196MiWv6m6vpGHvuPQJw5X5vPWN5EdKKwf
04fT2C8G2H1pHMwJI9QLWG3DGKwTsMJS/p23sd8dRQg+ALwV42BXbYReAC95HMxK
7wYAmzcOtgowbam8hyOf51tGf8/z3+9H/i+/H1kfXeyubinyumGP31A0jd9R2ttc
WPnYxlbsFncTyuEY0veiZm8ZtKfRvWxdg7vGx6wxUHPeAT6EFTQ2t7qLq5tqofM1
nDLOXc017I0oqKZyjUBQxtZwyjUtd4Hy7fblS+1LLPIGZU9El3urm1obwUgJ0KvX
g7MfRznc7g1KFT1egO62tlT7ajxjsMKoxa2u+qZaHI/Z1dFl7qbasbaKMvvyCP1t
2ITl1a2gtlFmjgljEC6I5ka3gryMba5p9dZ4ENKxje6NrTACONtWtfi97hpEcayI
oJgE2cOqqoK2tiJv9UZFAF6yhoC2+mqrfHe1uKvqm+qaq2rdmHbzXVWN9a0+MoZV
7rYad4uvyiP3Samqad64sbmJOQuWVywtX1xiN6UYZb73EC9YCsZuY1Uo1tdshBwt
rMrf6GveXAVv1UQYvuZG+tFYjFbv87m9G1nGWLnKTTdPrW5PVV19IwBVRHgGw5hN
dfXrMamqpmoEsJurqr3rN3HuqGd9dSMsWqTJPc4wsbQJGM1N7rZ6X5VPPlvnsCqv
cs8daanzN9WQpWIGmre7xu+7qNMs8OL1VWHpAWNXo8YLrLqlfv7G1vmb65vmo31+
K7dg8xtN803zFelchIEZbXIjH4dyEYZylz4eY1WU8rYi34cB1oG7VujOB8quoAYX
S1Mv8/ta/L5C9zr/etmSIi5KvxSKniLRK2mu9TfyzkuhGoBuJuiS6lblrMAOR/ZG
fm2t101Rx8fRFNcvqV/nrfbexffhN8YoycoF2MnxWKi/pCLlVepsKfUY5yYidx4u
ZlfZ6Y6sAP6oHkpc5paXhH0UvcRdvcl9CXwrziyRJb6oMb+ptqylvqkAZxsfu0EF
b+n2XUJAUi93t47aCBb7BVbE3saOjrc9mM1GNX9F5HB765q9G6ubatx8FBx25kdd
cjO5uJaZxkHLPSBVS/fG0dHk3e+CDm4sx2Lnt9I6UIkZVbAgJBAZWRFbATZ1K+sY
N+OyJdBgmKxa9oPoxa18fde7vQ4sFE3nNzEVTfLOrbXzfYwJF/GtBWtIlvGyzY+C
msJ9s7cIM8fui1Cdd+kM2f6Ycmzg+iaIKAJiWtXEt0lT5TqGpct7SI3LP16G8viD
W9Y64m6aDK1oiuxRdl8UCC1rcTfd7uZK9w2qj72n43pYSjBu5IEETUaNYiblPV5+
oTPfsThiZ//9+Wc/8ev+/vcTKA6n73o/OeMl+kuJ9kiMHjkD0J8I8d8Tz813jnqf
vLwJcDmKLV4I8CXwiqYNBP4i/MvBF38RHcBdXwxfzPH//bnoAymNkA4YLcaVxgZj
p3Gn8VnjG8YPjAPGvxhHjNmmZaa7TDtNh0x95qPm35o/Nn9mPme+2ZJiybMssdxn
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 )

WebView2 1.0.1150.38

関連
環境
  • HSP Ver 3.6 (0x3607)
  • OS Windows10 x64 21H2
  • WebView2 SDK Ver 1.0.1150.38
  • WebView2 ランタイム Ver 90.0.1150.30
準備
  • WebView2 ランタイム
    WebView2ランタイムをインストールする必要があります。
    WebView2 ランタイム または、Microsoft Edge Insider Channels から任意のランタイムをインストールします。
  • WebView2 SDK
    Microsoft.Web.WebView2から任意のバージョンをダウンロードする。(参照 リリースノート) ファイル名の拡張子nupkgをzipに変更して解凍する。
    build\native\x86\WebView2Loader.dll を実行ファイルのフォルダかパスが通ったフォルダにコピーする。
sample 1
#include "mod_WebView2_10115038.hsp"

	screen 0, 640, 480
	pEnv = WebView2_CreateEnv()
	pCtrl = WebView2_CreateCtrl(pEnv, hwnd)
	WebView2_Size pCtrl, 0, 0, ginfo_winx, ginfo_winy
	pView = WebView2_GetView(pCtrl)
	WebView2_Navigate pView, "https://hsp.tv/make/hsp3.html"
	onexit *ONEXIT_
	stop

*ONEXIT_
	WebView2_Release pView
	WebView2_Release pCtrl
	WebView2_Release pEnv
	end
sample 2
/* ---------------------------------------------------------
	include
   --------------------------------------------------------- */
#include "mod_WebView2_10115038.hsp"

/* ---------------------------------------------------------
	define
   --------------------------------------------------------- */
#define global DEF_URL "https://www.google.co.jp/"

#define global WM_SETFONT  0x0030

#define global TCM_GETITEMCOUNT  0x1304
#define global TCM_GETITEMA      0x1305
#define global TCM_INSERTITEMA   0x1307
#define global TCM_DELETEITEM    0x1308
#define global TCM_GETCURSEL     0x130b
#define global TCM_SETCURSEL     0x130c
#define global TCM_HITTEST       0x130d
#define global TCM_SETITEMW      0x133d
#define global TCM_INSERTITEMW   0x133e

#define global WV2Env_CreateWV2Ctrl           3
#define global WV2Ctrl_put_IsVisible          4
#define global WV2Ctrl_put_Bounds             6
#define global WV2Ctrl_GetParent             21
#define global WV2Ctrl_Close                 24
#define global WV2Ctrl_get_CoreWebView2      25
#define global WV2_get_Source                 4
#define global WV2_Navigate                   5
#define global WV2_add_NavigationCompleted   15
#define global WV2_del_NavigationCompleted   16
#define global WV2_ExecuteScript             29
#define global WV2_CapturePreview            30
#define global WV2_Reload                    31
#define global WV2_get_CanGoBack             38
#define global WV2_get_CanGoForward          39
#define global WV2_get_GoBack                40
#define global WV2_get_GoForward             41
#define global WV2_add_NewWindowRequested    44
#define global WV2_del_NewWindowRequested    45
#define global WV2_add_DocumentTitleChanged  46
#define global WV2_del_DocumentTitleChanged  47
#define global WV2_get_DocumentTitle         48
#define global WV2_add_FullScrChanged        52
#define global WV2_del_FullScrChanged        53
#define global WV2_GetFullScreen             54
#define global WV2_OpenTaskManagerWindow     79
#define global WV2_PrintToPdf                80
#define global WV2_IsDownloadDialogOpen      90
#define global WV2_OpenDownloadDialog        91
#define global WV2_CloseDownloadDialog       92
#define global WV2NewWnd_get_Uri              3
#define global WV2NewWnd_put_NewWindow        4
#define global WV2NewWnd_put_Handled          6
#define global WV2NewWnd_GetDeferral          9
#define global WV2Deferral_Complete           3

/* ---------------------------------------------------------
	ExecuteScript screen 2
   --------------------------------------------------------- */
	screen 2, ginfo_dispx, ginfo_dispy, 2, , , 320, 240
	title "ExecuteScript" : hWnd2 = hwnd : 	font "Consolas", 11 : objmode 2
	sdim bufExec, 1024 : sdim bufRes, 1024
	pos 0, 0 : objsize ginfo_winx, 20
	button gosub "ExecuteScript", *BTN_EXEC : hBtnExec = objinfo_hwnd(stat)
	p1 = (ginfo_winy - 20) / 2 : pos 0, 20
	mesbox bufExec, ginfo_winx, p1 : hMbExec = objinfo_hwnd(stat)
	pos 0, p1 + 20
	mesbox bufRes, ginfo_winx, p1 : hMbRes = objinfo_hwnd(stat)
	oncmd gosub *WM2_SIZE,  0x0005
	oncmd gosub *WM2_CLOSE, 0x0010

/* ---------------------------------------------------------
	Main Window
   --------------------------------------------------------- */
	WebView2_InitWnd 0
	hWnd0 = hwnd : title "WebView2"
	font "メイリオ", 11 : mref bmscr, 67 : hFont = bmscr(38)
	dim wndInfo, 7

	hMenu = CreateMenu()
	menuBuf(0) = "Back", "Forward", "Reload", "Navigate"
	menuBuf(4) = "New Tab", "Del Tab", "Execute", "Capture"
	menuBuf(8) = "PrintPDF", "DownLoad", "Task"
	repeat length(menuBuf)
		InsertMenu hMenu, -1, 0x400, 0x8000 + cnt, menuBuf(cnt)
	loop
	dim mi, 12 : mi = 48, 1 : mi(3) = 3
	SetMenu hWnd0, hMenu

	ldim lbCmd, length(menuBuf)
	lbCmd(0) = *CMD_BACK, *CMD_FORWARD, *CMD_RELOAD, *CMD_NAVIGATE
	lbCmd(4) = *CMD_NEW_TAB, *CMD_DEL_TAB, *CMD_EXECUTE, *CMD_CAPTURE
	lbCmd(8) = *CMD_PRINTPDF, *CMD_DOWNLOAD, *CMD_TASKMANAGER

	CreateWindowExA 0, "edit", 0, 0x56000080, 0, 0, 0, 0, hWnd0, 0, hinstance, 0
	hEditUrl = stat : sendmsg hEditUrl, WM_SETFONT, hFont, 1
	bufTmp = DEF_URL : SetWindowTextA hEditUrl, varptr(bufTmp)

	dim rc, 4 : dim tci, 7 : bAdd = 0 : bDel = 0
	CreateWindowExA 0, "SysTabControl32", 0, 0x56008468, 0, 0, 0, 0, hWnd0, 0, hinstance, 0
	hTab = stat : sendmsg hTab, WM_SETFONT, hFont, 1
	p1 = 0 << 16 : p1 |= 160 : sendmsg hTab, 0x1329, 0, p1

	pEnv = WebView2_CreateEnv()
	if ( pEnv == 0 ){ dialog "err WebView2_CreateEnv" : end }
	curCtrl = 0 : curView = 0

	oncmd gosub *EVENT_TITLE,    0x9000
	oncmd gosub *EVENT_COMPLETE, 0x9001
	oncmd gosub *EVENT_FULLSCR,  0x9002
	oncmd gosub *EVENT_NEWWND,   0x9003
	oncmd gosub *EVENT_NEWWND2,  0x9004
	oncmd gosub *EVENT_PRINT,    0x9005

	oncmd gosub *WM_SIZE,        0x0005
	oncmd gosub *WM_CLOSE,       0x0010
	oncmd gosub *WM_NOTIFY,      0x004E
	oncmd gosub *WM_COMMAND,     0x0111

	gosub *TAB_ADD
	stop

/* ---------------------------------------------------------
	Label Tab
   --------------------------------------------------------- */
*MENU_UPDATE
	mi(1) = 1
	if ( CCall2(dpCtrl(1), WV2_get_CanGoBack, 1, varptr(p1)) == 0 ){
		if ( p1 ){ mi(3) = 0 }
		else { mi(3) = 3 }
	}
	else { mi(3) = 3 }
	SetMenuItemInfo hMenu, 0, 1, varptr(mi)
	if ( CCall2(dpCtrl(1), WV2_get_CanGoForward, 1, varptr(p1)) == 0 ){
		if ( p1 ){ mi(3) = 0 }
		else { mi(3) = 3 }
	}
	else { mi(3) = 3 }
	SetMenuItemInfo hMenu, 1, 1, varptr(mi)
	DrawMenuBar hWnd0
	return

*TAB_GETINFO
	sendmsg hTab, TCM_GETCURSEL, 0, 0 : iTab = stat
	gosub *TAB_GETINFO2
	return

*TAB_GETINFO2
	pTabInfo = 0
	if ( iTab == -1 ){ return }
	tci(0) = 8 : sendmsg hTab, TCM_GETITEMA, iTab, varptr(tci)
	if ( stat == 0 ){ return }
	pTabInfo = tci(6)
	dupptr dpCtrl, WV2_DATA_SIZE * 28 + pTabInfo, 8, 4
	return

*TAB_SELECT
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	pView = -1 : gosub *TAB_UPDATE
	gosub *WM_SIZE
	ret = CCall2(dpCtrl, WV2Ctrl_put_IsVisible, 1, 1)
	return

*TAB_UPDATE
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	gosub *MENU_UPDATE
	if ( CCall2(dpCtrl(1), WV2_get_DocumentTitle, 1, varptr(p1)) == 0 ){
		if ( pView == -1 || pView == dpCtrl(1) ){ SetWindowTextW hWnd0, p1 }
		tci(0) = 1 : tci(3) = p1
		sendmsg hTab, TCM_SETITEMW, iTab, varptr(tci)
		CoTaskMemFree p1
	}
	if ( pView == -1 || pView == dpCtrl(1) ){
		if ( CCall2(dpCtrl(1), WV2_get_Source, 1, varptr(p1)) == 0 ){
			SetWindowTextW hEditUrl, p1
			CoTaskMemFree p1
		}
	}
	return

*TAB_ADD
	if ( bAdd ){ return }
	bAdd = 1
	gosub *TAB_ADD2
	gosub *EVENT_SET
	gosub *TAB_SELECT
	bufTmp = DEF_URL
	SetWindowTextA hEditUrl, varptr(bufTmp)
	gosub *CMD_NAVIGATE
	bAdd = 0
	return

*TAB_ADD2
	gosub *TAB_GETINFO
	if ( pTabInfo ){
		ret = CCall2(dpCtrl, WV2Ctrl_put_IsVisible, 1, 0)
	}
	sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : iTab = stat
	tci(0) = 9 : tci(6) = 0
	bufTmp = "Loading..." : tci(3) = varptr(bufTmp)
	sendmsg hTab, TCM_INSERTITEMA, iTab, varptr(tci)
	sendmsg hTab, TCM_SETCURSEL, iTab, 0
	curCtrl = WebView2_CreateCtrl(pEnv, hWnd0)
	curView = WebView2_GetView(curCtrl)
	if ( curCtrl == 0 || curView == 0 ){
		gosub *TAB_DEL
		return
	}
	return

*TAB_DEL
	sendmsg hTab, TCM_GETITEMCOUNT, 0, 0
	if ( stat <= 1 ){ return }
	if ( bDel ){ return }
	bDel = 1
	gosub *TAB_GETINFO2
	if ( pTabInfo == 0 ){ return }
	ret = CCall2(dpCtrl(0), WV2Ctrl_Close, 0)
	WebView2_Release dpCtrl(1)
	WebView2_Release dpCtrl(0)
	HeapFree GetProcessHeap(), 0, pTabInfo
	sendmsg hTab, TCM_DELETEITEM, iTab, 0
	if ( iTab ){ iTab-- }
	sendmsg hTab, TCM_SETCURSEL, iTab, 0
	gosub *TAB_SELECT
	bDel = 0
	return

/* ---------------------------------------------------------
	Label Event
   --------------------------------------------------------- */
*EVENT_TITLE
	pView = wparam : gosub *TAB_UPDATE
	return

*EVENT_COMPLETE
	pView = wparam : gosub *TAB_UPDATE
	return

*EVENT_FULLSCR
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	if ( dpCtrl(1) != wparam ){ return }
	if ( CCall2(dpCtrl(1), WV2_GetFullScreen, 1, varptr(p1)) ){ return }
	if ( p1 ){
		ShowWindow hEditUrl, 0
		ShowWindow hTab, 0
		wndInfo(0) = GetWindowLong(hWnd0, -20)
		wndInfo(1) = GetWindowLong(hWnd0, -16)
		wndInfo(2) = GetMenu(hWnd0)
		SetMenu hWnd0, 0
		if ( WebView2_GetWndRect(hWnd0, rc) == 0 ){ return }
		wndInfo(3) = rc(0), rc(1), rc(2), rc(3)
		SetWindowLong hWnd0, -20, 0
		SetWindowLong hWnd0, -16, wndInfo(1) & 0xff000000
		if ( WebView2_GetMonitorRect(hWnd0, rc) == 0 ){ return }
		SetWindowPos hWnd0, -1, rc(0), rc(1), rc(2), rc(3), 0x220
	}
	else {
		ShowWindow hEditUrl, 5
		ShowWindow hTab, 5
		SetWindowLong hWnd0, -20, wndInfo(0)
		SetWindowLong hWnd0, -16, wndInfo(1)
		if ( wndInfo(2) ){ SetMenu hWnd0, wndInfo(2) }
		if ( wndInfo(0) & 0x8 ){ p1 = -1 } else { p1 = -2 }
		SetWindowPos hWnd0, p1, wndInfo(3), wndInfo(4), wndInfo(5), wndInfo(6), 0x220
		ShowWindow hWnd0, 1
	}
	return

*EVENT_PRINT
	dialog strf("PDF isSuccessful %d", lparam)
	mi(1) = 1 : mi(3) = 0
	SetMenuItemInfo hMenu, 8, 1, varptr(mi)
	DrawMenuBar hWnd0
	bPDF = 0
	return

*EVENT_NEWWND
	if ( lparam == 0 || bAdd != 0 ){ return }
	bAdd = 1
	pNewWnd = lparam
	if ( CCall2(pNewWnd, WV2NewWnd_GetDeferral, 1, varptr(pDef)) == 0 ){
		PostMessage hWnd0, 0x9004, 0, 0
		bAdd = 1
	}
	return

*EVENT_NEWWND2
	if ( CCall2(pNewWnd, WV2NewWnd_put_Handled, 1, 1) == 0 ){
		if ( CCall2(pNewWnd, WV2NewWnd_get_Uri, 1, varptr(p1)) == 0 ){
			gosub *TAB_ADD2
			ret = CCall2(pNewWnd, WV2NewWnd_put_NewWindow, 1, curView)
			gosub *EVENT_SET
			gosub *TAB_SELECT
		}
	}
	ret = CCall2(pDef, WV2Deferral_Complete, 0)
	WebView2_Release pDef
	bAdd = 0
	return

*EVENT_SET
	pTabInfo = 0
	pTabInfo = HeapAlloc(GetProcessHeap(), 8, WV2_DATA_SIZE * 28 + 8)
	if ( pTabInfo == 0 ){ return }
	dupptr dp, pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_TITLECHANGED, hWnd0, 0x9000, dp
	ret = CCall2(curView, WV2_add_DocumentTitleChanged, 2, dp, varptr(dp(6)))

	dupptr dp, WV2_DATA_SIZE * 4 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_NAVIGATIONCOMPLETED, hWnd0, 0x9001, dp
	ret = CCall2(curView, WV2_add_NavigationCompleted, 2, dp, varptr(dp(6)))

	dupptr dp, WV2_DATA_SIZE * 8 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_FULLSCREEN, hWnd0, 0x9002, dp
	ret = CCall2(curView, WV2_add_FullScrChanged, 2, dp, varptr(dp(6)))

	dupptr dp, WV2_DATA_SIZE * 12 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_NEWWINDOW, hWnd0, 0x9003, dp
	ret = CCall2(curView, WV2_add_NewWindowRequested, 2, dp, varptr(dp(6)))

	dupptr dpCtrl, WV2_DATA_SIZE * 28 + pTabInfo, 8, 4
	dpCtrl(0) = curCtrl, curView

	tci(0) = 8 : tci(6) = pTabInfo
	sendmsg hTab, TCM_SETITEMW, iTab, varptr(tci)
	return

/* ---------------------------------------------------------
	Label Menu
   --------------------------------------------------------- */
*CMD_BACK
	gosub *TAB_GETINFO
	if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_get_GoBack, 0) }
	return

*CMD_FORWARD
	gosub *TAB_GETINFO
	if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_get_GoForward, 0) }
	return

*CMD_RELOAD
	gosub *TAB_GETINFO
	if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_Reload, 0) }
	return

*CMD_NAVIGATE
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	p1 = (GetWindowTextLengthW(hEditUrl) + 1) * 2
	sdim bufTmp, p1
	GetWindowTextW hEditUrl, varptr(bufTmp), p1
	ret = CCall2(dpCtrl(1), WV2_Navigate, 1, varptr(bufTmp))
	return

*CMD_NEW_TAB
	gosub *TAB_ADD
	return

*CMD_DEL_TAB
	gosub *TAB_DEL
	return

*CMD_EXECUTE
	if ( IsWindowVisible(hWnd2) ){
		SetWindowPos hWnd2, 0, 0, 0, 0, 0, 0x83
	}
	else {
		SetWindowPos hWnd2, -1, 0, 0, 0, 0, 0x63
	}
	return

*CMD_CAPTURE
	dialog "png", 17
	if ( stat == 0 ){ return }
	if ( SHCreateStreamOnFileEx(refstr, 0x1002, 0x80, 1, 0, p1) ){ return }
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	dupptr dp, WV2_DATA_SIZE * 20 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_CAPTURE, hWnd0, 0, dp
	ret = CCall2(dpCtrl(1), WV2_CapturePreview, 3, 0, p1, dp)
	WebView2_EventWait dp
	WebView2_Release p1
	return

*CMD_PRINTPDF
	if ( bPDF ){ return }
	dialog "pdf", 17
	if ( stat == 0 ){ return }
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	bPDF = 1
	mi(1) = 1 : mi(3) = 3
	SetMenuItemInfo hMenu, 8, 1, varptr(mi)
	DrawMenuBar hWnd0
	dupptr dp, WV2_DATA_SIZE * 24 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_PRINTTOPDF, hWnd0, 0x9005, dp
	sdim bufTmp, (strlen(refstr) + 1) * 2
	cnvstow bufTmp, refstr
	ret = CCall2(dpCtrl(1), WV2_PrintToPdf, 3, varptr(bufTmp), 0, dp)
	return stat

*CMD_DOWNLOAD
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	if ( CCall2(dpCtrl(1), WV2_IsDownloadDialogOpen, 1, varptr(p1)) ){ return }
	if ( p1 ){ p1 = WV2_CloseDownloadDialog } else { p1 = WV2_OpenDownloadDialog }
	ret = CCall2(dpCtrl(1), p1, 0)
	return

*CMD_TASKMANAGER
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	ret = CCall2(dpCtrl(1), WV2_OpenTaskManagerWindow, 0)
	return

/* ---------------------------------------------------------
	Label screen 0
   --------------------------------------------------------- */
*WM_SIZE
	GetClientRect hWnd0, varptr(rc)
	if ( IsWindowVisible(hEditUrl) ){
		MoveWindow hEditUrl, 8, 0, rc(2) - 16, 20, 0
		MoveWindow hTab, 0, 20, rc(2), 24, 0
		p1 = 44
	}
	else { p1 = 0 }
	gosub *TAB_GETINFO
	if ( pTabInfo ){
		WebView2_Size dpCtrl(0), 0, p1, rc(2), rc(3)
	}
	return

*WM_CLOSE
	sendmsg hTab, TCM_GETITEMCOUNT, 0, 0
	repeat stat
		iTab = cnt : gosub *TAB_DEL
	loop
	WebView2_Release pEnv
	if ( hMenu ){ DestroyMenu hMenu }
	return

*WM_NOTIFY
	if ( lparam == 0 ){ return }
	dupptr dpHdr, lparam, 12, 4
	if ( dpHdr(0) == hTab ){
		if ( dpHdr(2) == -552 ){
			sendmsg hTab, TCM_GETCURSEL, 0, 0
			if ( stat == -1 ){ return }
			iTab = stat : gosub *TAB_GETINFO2
			if ( pTabInfo == 0 ){ return }
			ret = CCall2(dpCtrl(0), WV2Ctrl_put_IsVisible, 1, 0)
		}
		if ( dpHdr(2) == -551 ){
			gosub *TAB_SELECT
			return
		}
		if ( dpHdr(2) == -5 ){
			dim tchi, 3
			GetCursorPos varptr(tchi)
			ScreenToClient hTab, varptr(tchi)
			sendmsg hTab, TCM_HITTEST, 0, varptr(tchi)
			if ( stat == -1 ){ return }
			iTab = stat : gosub *TAB_DEL
			return
		}
	}
	return

*WM_COMMAND
	if ( lparam == 0 && (wparam >> 16) == 0 ){
		id = wparam & 0xffff
		if ( id < 0x8000 || id >= (0x8000 + length(lbCmd)) ){ return }
		gosub lbCmd(id - 0x8000)
	}
	return

/* ---------------------------------------------------------
	Label screen 2
   --------------------------------------------------------- */
*WM2_SIZE
	GetClientRect hWnd2, varptr(rc)
	rc(3) = (rc(3) - 20) / 2
	MoveWindow hBtnExec, 0, 0, rc(2), 20, 1
	MoveWindow hMbExec, 0, 20, rc(2), rc(3), 1
	MoveWindow hMbRes, 0, rc(3) + 20, rc(2), rc(3), 1
	return

*WM2_CLOSE
	SetWindowPos hWnd2, 0, 0, 0, 0, 0, 0x83
	return 0

*BTN_EXEC
	gosub *TAB_GETINFO
	if ( pTabInfo == 0 ){ return }
	EnableWindow hBtnExec, 0
	p1 = (GetWindowTextLengthW(hMbExec) + 1) * 2
	sdim bufTmp, p1
	GetWindowTextW hMbExec, varptr(bufTmp), p1
	dupptr dp, WV2_DATA_SIZE * 16 + pTabInfo, WV2_DATA_SIZE * 4, 4
	WebView2_EventInit WV2_EVENT_EXECUTESCRIPT, 0, 0, dp
	if ( CCall2(dpCtrl(1), WV2_ExecuteScript, 2, varptr(bufTmp), dp) == 0 ){
		WebView2_EventWait dp
		if ( dp(WV2_DATA_WP) == 0 ){
			if ( WebView2_CnvWinStr(dp(WV2_DATA_LP), bufTmp) ){
				SetWindowTextA hMbRes, varptr(bufTmp)
			}
		}
	}
	EnableWindow hBtnExec, 1
	return
mod_WebView2_10115038.hsp
#ifndef MOD_WEBVIEW2_HSP_
#define global MOD_WEBVIEW2_HSP_

#include "user32.as"
#include "kernel32.as"

#ifndef CreateEventExA
#func global CreateEventEx "CreateEventExA" int,int,int,int
#endif // CreateEventExA

#include "ole32.as"

#ifndef SHCreateStreamOnFileEx
#uselib "Shlwapi.dll"
#func global SHCreateStreamOnFileEx "SHCreateStreamOnFileEx" wptr,int,int,int,int,var
#endif // SHCreateStreamOnFileEx

#uselib "combase.dll"
#func global WindowsCreateString       "WindowsCreateString"       wptr,int,var
#func global WindowsDeleteString       "WindowsDeleteString"       int
#func global WindowsGetStringRawBuffer "WindowsGetStringRawBuffer" int,var

#uselib "WebView2Loader.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

#enum global WV2_EVENT_CAPTURE = 0
#enum global WV2_EVENT_FULLSCREEN
#enum global WV2_EVENT_CREATECTRL
#enum global WV2_EVENT_CREATEENV
#enum global WV2_EVENT_TITLECHANGED
#enum global WV2_EVENT_EXECUTESCRIPT
#enum global WV2_EVENT_NAVIGATIONCOMPLETED
#enum global WV2_EVENT_NAVIGATIONSTARTING
#enum global WV2_EVENT_NEWWINDOW
#enum global WV2_EVENT_PRINTTOPDF
#enum global WV2_EVENT_SOURCECHANGED
#enum global WV2_EVENT_WINDOWCLOSE
#enum global WV2_EVENT_MAX

#enum global WV2_DATA_PT = 0
#enum global WV2_DATA_VT
#enum global WV2_DATA_WP
#enum global WV2_DATA_LP
#enum global WV2_DATA_HWND
#enum global WV2_DATA_EVENT
#enum global WV2_DATA_TOKENL
#enum global WV2_DATA_TOKENH
#enum global WV2_DATA_SIZE

#ifndef MOD_COMCALL_HSP_
#define global MOD_COMCALL_HSP_

#module mod_ComCall
#deffunc ComCall_Init
	if ( codeComCall ){ return }
	dim prm, 3
	dim prm2, 4
	dim codeComCall, 10
	codeComCall(0) = $8bec8b55, $4d8b1045, $ff03eb14, $7d498834, $084d8bfa, $8b018b51, $048b0c55, $c9d0ff90
	codeComCall(8) = $000000c3

	fCCall = varptr(codeComCall)
	VirtualProtect varptr(codeComCall), length(codeComCall) * 4, 0x40, varptr(p1)
	return

#defcfunc CCall int this_, int id_, array prm_, int prms_
	if ( this_ == 0 ){ return 0 }
	prm = this_, id_, varptr(prm_), prms_
	return callfunc(prm, fCCall, 4)

#defcfunc CCall2 int this_, int id_, int prms_, int p1_, int p2_, int p3_, int p4_
	if ( prms_ != 0 ){
		if ( prms_ == 1 ){ prm2 = p1_ }
		else {
		if ( prms_ == 2 ){ prm2 = p1_, p2_ }
		else {
		if ( prms_ == 3 ){ prm2 = p1_, p2_, p3_ }
		else {
		if ( prms_ == 4 ){ prm2 = p1_, p2_, p3_, p4_ }
		}}}
	}
	return CCall(this_, id_, prm2, prms_)
#global
	ComCall_Init
#endif // MOD_COMCALL_HSP_

#module mod_WebView2

#deffunc WebView2_Init
	if ( codeEH ){ return }
	dim codeEH, 139
	codeEH(  0) = $004002b8, $000cc280
	codeEH(  2) = $04c2c033, $00000000
	codeEH(  4) = $04c2c033, $00000000
	codeEH(  6) = $08244c8b, $24748b56, $7c8b5708, $7e831424, $4e89000c, $087e8904, $51571d74, $c71076ff
	codeEH( 14) = $aa1c2444, $ffaaaaaa, $448b0c76, $d0ff2024, $5ec0335f, $85000cc2, $8b0674c9, $50ff5101
	codeEH( 22) = $74ff8504, $57078b06, $ff0450ff, $44c71076, $bbbb1424, $448bbbbb, $d0ff1424, $1046c75f
	codeEH( 30) = $00000000, $c25ec033, $0000000c
	codeEH( 33) = $0824448b, $5575c085, $0c244c8b, $24748b56, $04468908, $39084e89, $1c740c46, $76ff5051
	codeEH( 41) = $2444c710, $aaaaaa18, $0c76ffaa, $1c24448b, $c033d0ff, $000cc25e, $0674c985, $ff51018b
	codeEH( 49) = $76ff0450, $2444c710, $bbbbbb10, $24448bbb, $c7d0ff10, $00001046, $c0330000, $000cc25e
	codeEH( 57) = $5c8b5351, $8b571024, $8310247c, $89000c7f, $2574045f, $18244c8b, $77ff5351, $084f8910
	codeEH( 65) = $c70c77ff, $aa282444, $8baaaaaa, $ff28244c, $c38b5fd1, $0cc2595b, $24448d00, $2444c714
	codeEH( 73) = $cccccc10, $74ff50cc, $44c71c24, $dddd1024, $448bdddd, $44c71824, $00001c24, $d0ff0000
	codeEH( 81) = $2474ff50, $24448b20, $ffd0ff14, $c9331077, $440fc085, $8918244c, $44c7084f, $bbbb1c24
	codeEH( 89) = $448bbbbb, $d0ff1c24, $001047c7, $8b000000, $595b5fc3, $00000cc2
	codeEH( 95) = $0c24448b, $24748b56, $7c8b5708, $7e831024, $7e89000c, $08468904, $57501d74, $c71076ff
	codeEH(103) = $aa1c2444, $ffaaaaaa, $4c8b0c76, $d1ff2024, $5e5fc78b, $ff000cc2, $44c71076, $bbbb1424
	codeEH(111) = $448bbbbb, $d0ff1424, $46c7c78b, $00000010, $c25e5f00, $0000000c
	codeEH(117) = $24748b56, $7c8b5708, $7e831024, $7e89000c, $0846c704, $00000000, $006a1e74, $1076ff57
	codeEH(125) = $1c2444c7, $aaaaaaaa, $8b0c76ff, $ff20244c, $5fc78bd1, $0008c25e, $c71076ff, $bb142444
	codeEH(133) = $8bbbbbbb, $ff142444, $c7c78bd0, $00001046, $5e5f0000, $000008c2

	dim aTmp, 8
	p1 = varptr(SendMessageA) : aTmp = 59, 169, 267, 415, 504
	repeat 5 : lpoke codeEH, aTmp(cnt), p1 : loop
	p1 = varptr(CloseHandle) : aTmp = 106, 205, 354, 442, 531
	repeat 5 : lpoke codeEH, aTmp(cnt), p1 : loop
	lpoke codeEH, 293, varptr(lstrlenW)
	lpoke codeEH, 306, varptr(WindowsCreateString)
	vtHdlIxI = varptr(codeEH(0)), varptr(codeEH(2)), varptr(codeEH(4)), varptr(codeEH(6))
	vtHdlHxI = varptr(codeEH(0)), varptr(codeEH(2)), varptr(codeEH(4)), varptr(codeEH(33))
	vtHdlHxW = varptr(codeEH(0)), varptr(codeEH(2)), varptr(codeEH(4)), varptr(codeEH(57))
	vtHdlHxB = varptr(codeEH(0)), varptr(codeEH(2)), varptr(codeEH(4)), varptr(codeEH(95))
	vtHdlH   = varptr(codeEH(0)), varptr(codeEH(2)), varptr(codeEH(4)), varptr(codeEH(117))
	vtHdl = varptr(vtHdlIxI), varptr(vtHdlHxI), varptr(vtHdlHxW), varptr(vtHdlHxB), varptr(vtHdlH)
	VirtualProtect varptr(codeEH), length(codeEH) * 4, 0x40, varptr(p1)

	dim eVT, WV2_MAXHDL
	eVT(0)  = 4, 0, 1, 1, 0, 2, 0, 0, 0, 3, 0, 0
	return

#deffunc WebView2_EventInit int enumEvent, int hWnd_, int nMsg, array aData
	aData(WV2_DATA_PT) = varptr(aData(WV2_DATA_VT))
	aData(WV2_DATA_VT) = vtHdl(eVT(enumEvent))
	aData(WV2_DATA_EVENT) = enumEvent
	if ( hWnd_ ){
		aData(WV2_DATA_HWND) = hWnd_
		aData(WV2_DATA_EVENT) = nMsg
	}
	else {
		CreateEventEx 0, 0, 0, 0x1F0003
		p1 = stat
		if ( p1 == 0 ){ return 0 }
		aData(WV2_DATA_EVENT) = p1
		aData(WV2_DATA_HWND) = 0
	}
	return

#deffunc WebView2_EventWait array aData
	if ( aData(WV2_DATA_EVENT) == 0 ){ return 0 }
	repeat
		WaitForSingleObject aData(WV2_DATA_EVENT), 100
		if ( stat == 0 || stat != 0x102 ){ break }
		await 10
	loop
	return 1

#deffunc WebView2_AddRef int pv
	return CCall2(pv, 1, 0)

#deffunc WebView2_Release int pv
	return CCall2(pv, 2, 0)

#defcfunc WebView2_CreateEnv
	dim aEnv, WV2_DATA_SIZE
	WebView2_EventInit WV2_EVENT_CREATEENV, 0, 0, aEnv
	ret = 0
	CreateCoreWebView2Environment aEnv
	if ( stat == 0 ){
		WebView2_EventWait aEnv
		if ( aEnv(WV2_DATA_WP) == 0 && aEnv(WV2_DATA_LP) != 0 ){ ret = 1 }
	}
	if ( ret == 0 ){ return 0 }
	return aEnv(WV2_DATA_LP)

#defcfunc WebView2_CreateCtrl int pEnv, int hWnd_
	dim aCtrl, WV2_DATA_SIZE
	WebView2_EventInit WV2_EVENT_CREATECTRL, 0, 0, aCtrl
	ret = 0
	if ( CCall2(pEnv, 3, 2, hWnd_, aCtrl) == 0 ){
		WebView2_EventWait aCtrl
		if ( aCtrl(WV2_DATA_WP) == 0 && aCtrl(WV2_DATA_LP) != 0 ){ ret = 1 }
	}
	if ( ret == 0 ){ return 0 }
	return aCtrl(WV2_DATA_LP)

#defcfunc WebView2_GetView int pCtrl
	if ( CCall2(pCtrl, 25, 1, varptr(p1)) ){ return 0 }
	return p1

#deffunc WebView2_Size int pCtrl, int x, int y, int w, int h
	if ( CCall2(pCtrl, 6, 4, x, y, w, h) ){ return 0 }
	return 1

#deffunc WebView2_Navigate int pView, str sUrl
	sdim bufTmp, (strlen(sUrl) + 1) * 2
	cnvstow bufTmp, sUrl
	if ( CCall2(pView, 5, 1, varptr(bufTmp)) ){ return 0 }
	return 1

#defcfunc WebView2_CnvpWtoS int pWStr, var vBuf
	if ( pWStr == 0 ){ return 0 }
	sdim bufTmp, (lstrlenW(pWStr) + 1) * 2
	lstrcpyW varptr(bufTmp), pWStr
	vBuf = cnvwtos(bufTmp)
	bufTmp = 0
	return 1

#defcfunc WebView2_CnvWinStr int pWinStr, var vBuf
	if ( pWinStr == 0 ){ return 0 }
	WindowsGetStringRawBuffer pWinStr, p1
	p1 = stat
	ret = 1
	if ( WebView2_CnvpWtoS(p1, vBuf) == 0 ){ ret = 0 }
	if ( p1 ){ WindowsDeleteString pWinStr }
	return ret

#defcfunc WebView2_GetMonitorRect int hWnd_, array aRect
	dim pmi, 10 : pmi(0) = 40
	MonitorFromWindow hWnd_, 1
	if ( GetMonitorInfo(stat, varptr(pmi)) == 0 ){ return 0 }
	pmi(3) -= pmi(1) : pmi(4) -= pmi(2)
	dim aRect, 4
	CopyRect varptr(aRect), varptr(pmi(1))
	return 1

#defcfunc WebView2_GetWndRect int hWnd_, array aRect
	dim wndPl, 11 : wndPl(0) = 44
	if ( GetWindowPlacement(hWnd_, varptr(wndPl)) == 0 ){ return 0 }
	dim aRect, 4
	wndPl(9) -= wndPl(7) : wndPl(10) -= wndPl(8)
	CopyRect varptr(aRect), varptr(wndPl(7))
	return 1

#deffunc WebView2_InitWnd int wndID
	mref bmscr, 96 + wndID
	hWndTmp = bmscr(13)
	if ( WebView2_GetMonitorRect(hWndTmp, rcMon) == 0 ){ return 0 }
	if( WebView2_GetWndRect(hWndTmp, rcWnd) == 0 ){ return 0 }
	screen wndID, rcMon(2), rcMon(3), 2, , , rcWnd(2), rcWnd(3)
	GetWindowLong hwnd, -16
	SetWindowLong hwnd, -16, stat | 0x50000
	SetWindowPos hwnd, 0, 0, 0, 0, 0, 0x63
	return 1

#global

	WebView2_Init

#endif // MOD_WEBVIEW2_HSP_
コメント ( 9 ) | Trackback ( 0 )

Scintilla

関連
Scintilla 公式
A free source code editing component for Win32, GTK, and OS X
ライセンス
License
License for Scintilla and SciTE
Copyright 1998-2002 by Neil Hodgson 

All Rights Reserved 

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
provided that the above copyright notice appear in all copies and that 
both that copyright notice and this permission notice appear in 
supporting documentation. 

NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY 
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE 
OR PERFORMANCE OF THIS SOFTWARE. 
準備
SciLexer.dll
Download Scintilla and SciTEから、 SciTEをダウンロードする。(例 full 32-bit download
現状、HSPは64ビットをフルサポートしていないので32-bitを使用してください。解凍して、SciLexer.dllを検索パスにコピーする。
Scintilla Edit コントロールの作成
上記画像は、右クリックでのメニューも表示させています。 エラーがなければ、Scintillaコントロールが作成されて、文字を入力できます。 デフォルト状態では、文字が小さかったので、次はフォントの変更をしてみます。
#include "user32.as"
#include "kernel32.as"

	screen 0, 300, 200
	title "Scintilla"
	LoadLibrary "SciLexer.dll"
	dllSciLexer = stat
	if ( dllSciLexer == 0 ){ dialog "Err SciLexer.dll", , "終了" : end }
	st = 0x52010000 : w = ginfo_winx : h = ginfo_winy
	CreateWindowEx 0, "Scintilla", "Scintilla", st, 0, 0, w, h, hwnd, 0x8000, hinstance, 0
	hEdit = stat
	SetFocus hEdit
	stop
コメント ( 0 ) | Trackback ( 0 )

mod_WebView2_08355.hsp

関連
WebView2_08355.hsp
HSP用WebView2.hの定義ファイル
環境
OS:Windows10 x64
HSP: Ver3.5
開発用Edgeは、アンインストール。
リリース版Edgeのバージョンは、80.0.361.48 (公式ビルド) (64 ビット)。
サンプル WebView2 コントロールの表示
mod_WebView2_08355.hspは、サンプルの下に記載。
#include "mod_WebView2_08355.hsp"

	screen 0, 600, 400
	WebView2New web
	WebView2Size web, 0, 0, ginfo_winx, ginfo_winy
	WebView2Navigate web, "https://www.bing.com"
	stop
サンプル WebView2 イベント処理
mod_WebView2_08355.hspは、サンプルの下に記載。
#include "mod_WebView2_08355.hsp"

	screen 0, 600, 400
	WebView2New web
	WebView2Size web, 0, 0, ginfo_winx, ginfo_winy

	dim token, 2
	WebView2EventInit webEvent, 0x9000
	WebView2EventSetBegin webEvent, WebView2_NavigationCompleted, *WEB_COMPLETED
	IWebView2WebView_add_NavigationCompleted web, stat, token
	WebView2EventSetEnd webEvent, WebView2_NavigationCompleted, token

	WebView2Navigate web, "https://www.bing.com"
	stop

*WEB_COMPLETED
	IWebView2WebView3_get_DocumentTitle web, tmp
	if ( stat == 0 ){
		WebView2WtoS tmp, buf
	}
	else { buf = "err" }
	title buf
	return
mod_WebView2_08355.hsp
#ifndef MOD_WEBVIEW2_HSP_
#define global MOD_WEBVIEW2_HSP_

#include "user32.as"
#include "kernel32.as"
#ifndef CreateEventExA
#func global CreateEventEx "CreateEventExA" int,sptr,int,int
#endif
#include "ole32.as"
#include "WebView2_08355.hsp"

#enum global WebView2_NavigationStarting = 0
#enum global WebView2_DocumentStateChanged
#enum global WebView2_NavigationCompleted
#enum global WebView2_FrameNavigationStarting
#enum global WebView2_MoveFocusRequested
#enum global WebView2_GotFocus
#enum global WebView2_LostFocus
#enum global WebView2_WebResourceRequested
#enum global WebView2_ScriptDialogOpening
#enum global WebView2_ZoomFactorChanged
#enum global WebView2_PermissionRequested
#enum global WebView2_ProcessFailed
#enum global WebView2_ScriptToExecuteOnDocumentCreated
#enum global WebView2_ExecuteScript
#enum global WebView2_CapturePreview
#enum global WebView2_WebMessageReceived
#enum global WebView2_CallDevToolsProtocolMethod
#enum global WebView2_DevToolsProtocolEventReceived
#enum global WebView2_NewWindowRequested
#enum global WebView2_DocumentTitleChanged
#enum global WebView2_AcceleratorKeyPressed
#enum global WEBVIEW2_NewVersionAvailable
#enum global WebView2_MAXHDL

#module mod_WebView2

#deffunc WevView2Init
	p1 = 0
	dim p2, 2
	dTmp = 0.0
	ldim lbTmp, 1
	eVt(0)  = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	eVt(10) = 0, 0, 1, 1, 2, 0, 1, 0, 0, 0
	eVt(20) = 0, 0
	WebView2InitHdl
	return

#deffunc WebView2InitHdl
	if ( codeWeb2Hdl == 0 ){
		dim codeWeb2Hdl, 136
		codeWeb2Hdl(0) = $0c24448b, $04244c8b, $c0330889, $00000cc2
		codeWeb2Hdl(8) = $04c2c033, $00000000
		codeWeb2Hdl(16) = $04c2c033, $00000000
		codeWeb2Hdl(24) = $8b575653, $8514247c, $8b0674ff, $50ff5707, $245c8b04, $74db8518, $53038b06, $8b0450ff
		codeWeb2Hdl(32) = $83102474, $8900147e, $5e89047e, $ff117408, $44c71476, $aaaa1824, $448baaaa, $d0ff1824
		codeWeb2Hdl(40) = $00187e83, $006a1774, $1c76ff56, $202444c7, $bbbbbbbb, $8b1876ff, $ff242444, $335e5fd0
		codeWeb2Hdl(48) = $0cc25bc0, $00000000
		codeWeb2Hdl(56) = $0824448b, $4675c085, $24748b56, $147e8308, $04468900, $1024448b, $74084689, $1476ff11
		codeWeb2Hdl(64) = $102444c7, $aaaaaaaa, $1024448b, $7e83d0ff, $17740018, $ff56006a, $44c71c76, $bbbb1824
		codeWeb2Hdl(72) = $76ffbbbb, $24448b18, $33d0ff1c, $0cc25ec0, $00000000
		codeWeb2Hdl(80) = $24748b56, $7c8b5708, $7e831024, $7e890014, $ff117404, $44c71476, $aaaa1424, $448baaaa
		codeWeb2Hdl(88) = $d0ff1424, $00187e83, $006a1774, $1c76ff56, $1c2444c7, $bbbbbbbb, $8b1876ff, $ff20244c
		codeWeb2Hdl(96) = $5fc78bd1, $0008c25e, $00000000
		codeWeb2Hdl(104) = $0824448b, $5675c085, $7c8b5756, $ff851424, $078b0674, $0450ff57, $0c24748b, $00147e83
		codeWeb2Hdl(112) = $000446c7, $89000000, $1174087e, $c71476ff, $aa142444, $8baaaaaa, $ff142444, $187e83d0
		codeWeb2Hdl(120) = $6a177400, $76ff5600, $2444c71c, $bbbbbb1c, $1876ffbb, $2024448b, $335fd0ff, $0cc25ec0
		codeWeb2Hdl(128) = $00000000
		p1 = varptr(SetEvent)
		lpoke codeWeb2Hdl, 150, p1 : lpoke codeWeb2Hdl, 260, p1 : lpoke codeWeb2Hdl, 346, p1 : lpoke codeWeb2Hdl, 467, p1
		p1 = varptr(SendMessageA)
		lpoke codeWeb2Hdl, 176, p1 : lpoke codeWeb2Hdl, 286, p1 : lpoke codeWeb2Hdl, 372, p1 : lpoke codeWeb2Hdl, 493, p1
		VirtualProtect varptr(codeWeb2Hdl), 136 * 4, 0x40, varptr(p1)
		vtWeb2Hdl_IxI = varptr(codeWeb2Hdl(0)), varptr(codeWeb2Hdl(8)), varptr(codeWeb2Hdl(16)), varptr(codeWeb2Hdl(24))
		vtWeb2Hdl_HxW = varptr(codeWeb2Hdl(0)), varptr(codeWeb2Hdl(8)), varptr(codeWeb2Hdl(16)), varptr(codeWeb2Hdl(56))
		vtWeb2Hdl_H   = varptr(codeWeb2Hdl(0)), varptr(codeWeb2Hdl(8)), varptr(codeWeb2Hdl(16)), varptr(codeWeb2Hdl(80))
		vtWeb2Hdl_HxI = varptr(codeWeb2Hdl(0)), varptr(codeWeb2Hdl(8)), varptr(codeWeb2Hdl(16)), varptr(codeWeb2Hdl(104))
		dim vtHdl, 4
		vtHdl = varptr(vtWeb2Hdl_IxI), varptr(vtWeb2Hdl_HxW), varptr(vtWeb2Hdl_H), varptr(vtWeb2Hdl_HxI)
	}
	return

#deffunc WebView2Wait int hdlEvent
	if ( hdlEvent == 0 ){ return 1 }
	p2 = hdlEvent
	repeat
		await 1
		CoWaitForMultipleHandles 0, 1, 1, varptr(p2), varptr(p1)
		if ( stat == 0 || stat != 0x80010115 ){ break }
	loop
	p1 = stat
	CloseHandle p2
	return p1

#deffunc WebView2CWtoS int pWStr, var dst
	if ( pWStr == 0 ){ return 0 }
	WideCharToMultiByte 0, 0, pWStr, -1, 0, 0, 0, 0
	if ( stat == 0 ){ return 0 }
	sdim dst, stat + 1
	WideCharToMultiByte 0, 0, pWStr, -1, varptr(dst), stat, 0, 0
	return 1

#deffunc WebView2WtoS int pWStr, var dst
	WebView2CWtoS pWStr, dst
	p1 = stat
	CoTaskMemFree pWStr
	return p1

*WM_WEBVIEW2
	if ( wparam == 0 ){ return }
	dupptr dpHdl, wparam, 44, 4
	if ( dpHdl(4) >= WebView2_MAXHDL || dpHdl(10) == 0 ){ return }
	lpoke lbTmp, 0, dpHdl(10)
	gosub lbTmp
	return

#defcfunc WebView2HdlEvent array hdl
	CreateEventEx 0, 0, 0, 0x1F0003
	if ( stat == 0 ){ return 0 }
	dim hdl, 11
	hdl(0) = vtHdl(3)
	hdl(5) = stat
	return 1

#deffunc WebView2EnvInit var env
	dimtype env, 6, 1
	if ( WebView2HdlEvent(hdlTmp) == 0 ){ return 0 }
	CreateWebView2Environment varptr(hdlTmp)
	if ( stat ){ dialog strf("%#x", stat) : return 0 }

	WebView2Wait hdlTmp(5)
	if ( hdlTmp(1) != 0 || hdlTmp(2) == 0 ){ return 0 }
	newcom env, IWebView2Environment3, -1, hdlTmp(2)
	return 1

#deffunc WebView2New2 var env, var cWeb
	dimtype cWeb, 6, 1
	if ( WebView2HdlEvent(hdlTmp) == 0 ){ return 0 }
	IWebView2Environment_CreateWebView env, hwnd, varptr(hdlTmp)
	if ( stat == 0 ){
		WebView2Wait hdlTmp(5)
		if ( hdlTmp(1) == 0 && hdlTmp(2) != 0 ){
			newcom cWeb, IWebView2WebView, -1, hdlTmp(2)
		}
	}
	return 1

#deffunc WebView2New var cWeb
	WebView2EnvInit envTmp
	if ( stat == 0 ){ return 0 }
	WebView2New2 envTmp, cWeb
	envTmp = 0
	return stat

#deffunc WebView2Setting var cWeb, var cSetting
	IWebView2WebView_get_Settings cWeb, p1
	if ( stat ){ return 0 }
	newcom cSetting, IWebView2Settings2, -1, p1
	return 1

#deffunc WebView2Size var cWeb, int x, int y, int w, int h
	if ( varuse(cWeb) == 0 ){ return 0 }
	IWebView2WebView_put_Bounds cWeb, x, y, x + w, y + h
	if ( stat ){ return 0 }
	return 1

#deffunc WebView2Navigate var cWeb, str sUrl
	if ( varuse(cWeb) == 0 ){ return 0 }
	IWebView2WebView_Navigate cWeb, sUrl
	if ( stat ){ return 0 }
	return 1

#deffunc WebView2Write var cWeb, str sSrc
	if ( varuse(cWeb) == 0 ){ return 0 }
	IWebView2WebView_NavigateToString cWeb, sSrc
	if ( stat ){ return 0 }
	return 1

#deffunc WebView2Script var cWeb, str sSrc
	IWebView2WebView_ExecuteScript cWeb, sSrc, 0
	return

#deffunc WebView2EventInit array hdl, int idWebView2
	dim hdl, 11, WEBVIEW2_MAXHDL
	repeat WEBVIEW2_MAXHDL
		hdl(0, cnt) = vtHdl(eVt(cnt))
		hdl(4, cnt) = cnt, 0, hwnd, idWebView2
	loop
	oncmd gosub *WM_WEBVIEW2, idWebView2
	return

#deffunc WebView2EventSetBegin array hdl, int idEvent, label lbEvent
	if ( hdl(8, idEvent) != 0 || hdl(9, idEvent) != 0 || hdl(10, idEvent) != 0 ){
		return 0
	}
	lbTmp = lbEvent : hdl(10, idEvent) = lpeek(lbTmp, 0)
	return varptr(hdl(0, idEvent))

#deffunc WebView2EventSetEnd array hdl, int idEvent, array aToken
	hdl(8, idEvent) = aToken(0), aToken(1)
	return 1

#deffunc WebView2EventDelBegin array hdl, int idEvent, array aToken
	dim aToken, 2
	aToken = hdl(8, idEvent), hdl(9, idEvent)
	return 1

#deffunc WebView2EventDelEnd array hdl, int idEvent
	if ( stat ){ return 0 }
	hdl(8, idEvent) = 0, 0, 0
	return 1

#deffunc WebView2EventGet array eventInfo
	dupptr dp, wparam, 44, 4
	// InvokeArg1, InvokeArg2, IWebView2WebView*, ENUM_WEBVIEW2
	eventInfo = dp(1), dp(2), dp(3), dp(4)
	return

#global

	WevView2Init

#endif // MOD_WEBVIEW2_HSP_
コメント ( 0 ) | Trackback ( 0 )
« 前ページ 次ページ »