色々試していて気付いたのですが、どうやら「Microsoft Visual C++再頒布可能パッケージ(x86版)」がインストールされていないと動かないようです。 (設定>アプリ>インストールされているアプリ>Microsoft Visual C++ 2015-2022 Redistributable(x86) - 14.36.32532)
具体的には、 #uselib "wv2.dll" #func global GetAvailableCoreWebView2BrowserVersionString "GetAvailableCoreWebView2BrowserVersionString" wptr,var
mes varptr(GetAvailableCoreWebView2BrowserVersionString) GetAvailableCoreWebView2BrowserVersionString 0, v mes v 上記のスクリプトで、5行目で「Error 38 -->外部DLLの呼び出しに失敗しました」と出ます。 また、mes varptr(...) は0が出力されています。
wv2.dll等をモジュールから取り出して使えるのが大変便利だと感動しました!
公開して頂きありがとうございます。
色々試していて気付いたのですが、どうやら「Microsoft Visual C++再頒布可能パッケージ(x86版)」がインストールされていないと動かないようです。
(設定>アプリ>インストールされているアプリ>Microsoft Visual C++ 2015-2022 Redistributable(x86) - 14.36.32532)
具体的には、
#uselib "wv2.dll"
#func global GetAvailableCoreWebView2BrowserVersionString "GetAvailableCoreWebView2BrowserVersionString" wptr,var
mes varptr(GetAvailableCoreWebView2BrowserVersionString)
GetAvailableCoreWebView2BrowserVersionString 0, v
mes v
上記のスクリプトで、5行目で「Error 38 -->外部DLLの呼び出しに失敗しました」と出ます。
また、mes varptr(...) は0が出力されています。
Hyper-VのWindows10仮想マシン上で「Visual C++再頒布可能パッケージ(x86)」がインストールされていない環境では上記の通りのエラーが出ましたが、
下記リンクの「vc_redist.x86.exe」でパッケージをインストールすると正常に動作しました。
https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170
(x64版ではエラーは解消されませんでした。)
以前、教えて頂いたWebView2Loader.dllでは、このVisual C++再頒布可能パッケージ(x86)は無くても動作するようでした。
なんとか、この wv2.dll, ComCall.dll をパッケージ無しの環境でも動作するように出来ないでしょうか。
ご調査・ご検討願えれば幸いです。何卒よろしくお願い致します。
「Visual C++再頒布可能パッケージ(x86)は無くても動作する」件については、現状難しいです。
考えてみます。
>「Visual C++再頒布可能パッケージ(x86)は無くても動作する」件については、現状難しいです。
わかりました。
現状はパッケージのインストールが必要ということで理解したいと思います。
無理なお願いをしてしまったかもしれません。失礼いたしました。
もしも簡単に対処できる方法等が見つかれば、そのときは検討してみて頂けると助かります。
WebView2用DLL 「wv2s.dll」を作成してみました。
Windows8.1、Windows10にて動作確認しました。
以下リンクです。
wv2s.dll - 1
https://blog.goo.ne.jp/hiro239415/e/279927d2a52e6390a2abc17ce166795f
ワガママ言ってすみませんでした。
それにも関わらず、しかも速攻で対応して頂けてとても嬉しいです!
対応OSもWindows8.1以降ということで申し分ないと思います。
(Windows10以上のどの環境の人も範囲内であれば十分くらいだと思っていました。)
あれ?『入力内容を確認してください』と出て投稿できません。
分割して投稿を試させて頂いてます。
---------
どのページにも何も投稿できなくなってしまいました。。。
---------
投稿できた。ということは内容が悪さしてますよね。何回も途切れ途切れの投稿ごめんなさい。
------
さて、誠に勝手ながらHSPTV掲示板で宣伝させてもらいました。
hsp.tv/play/pforum.php?mode=all&num=99573
自作のnetincludeモジュールを使った方のサンプルでは、WebView2ランタイムがインストールされていない環境だとスタンドアロン(ポータブル)版ランタイムをダウンロード&展開するようになっています。
また、なんとかComCall周りを 素人が見たときにももう少しだけ取っ付きやすくしてみたい一心で、WV2CCallなんてものをサンプルにコメントで含めてみました。
・現状では適用箇所にコメントアウトして書いてます。
・モジュールはカレントフォルダ内 奥のほうにplus_wv2ccall.hspが作られています。
ただ、中身がぶっ飛んでるので本当にこんな処理で良いのか、もっと良い実装方法は無いか相談に乗ってもらえると助かります。
(単純に以前のようなComCall2があるだけでも良いかもとは思っています。)
------
ブツ切れのコメントになってしまってごめんなさい。ブログの編集で一纏めとかに出来ますでしょうか?お手数ばかりお掛けして申し訳ありません。
------
> もっと良い実装方法は無いか相談に乗ってもらえると助かります。
メソッド名を指定して簡単に呼び出しできて便利だと思いました。
しかし、呼び出しのたびにメソッド検索しているのが気になりました。
すみませんが、良い実装方法は思いつきません。
下記の「WV2_get_CoreWebView2」のように、
define定義を書いていくしかないかなと思います。
(doubleやint64を引数にとるメソッドもありますので厄介です)
#module
#defcfunc CCall_ int this_, int id, int num, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8
prm = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
ComCall this_, id, prm, num
return stat
#define global ctype CCall(%1, %2, %3, %4 = 0, %5 = 0, %6 = 0, %7 = 0, %8 = 0, %9 = 0, %10 = 0, %11 = 0) \
CCall_(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11)
#define global ctype WV2_get_CoreWebView2(%1, %2) CCall(%1, 25, 1, varptr(%2))
#global
if ( WV2_get_CoreWebView2(ctrl, web) ) { dialog "error" }
本題とは関係ありませんが、
識別されるラベル・変数の最大文字数は59文字(半角)
ですので注意が必要です。
> ブツ切れのコメントになってしまってごめんなさい。
> ブログの編集で一纏めとかに出来ますでしょうか?
いえいえ、問題ありません。
纏める機能が無いようですし、このままで大丈夫です。
> 呼び出しのたびにメソッド検索しているのが気になりました。
>「WV2_get_CoreWebView2」のように、
> define定義を書いていくしかないかなと思います。
やはりそうですよね。
ただ、例えば「get_Uri」とかは同じ名前でも別IIDでいくつもあるので、
#define ICoreWebView2BasicAuthenticationRequestedEventArgs_get_Uri 3
#define ICoreWebView2DownloadOperation_get_Uri 9
みたいに長ったらしくなるか、
#define WV2_BAREA_get_Uri 3
#define WV2_DO_get_Uri 9
みたいに省略すると何のIIDか分からなくなってしまうと思っていて。
(この省略は極端ですがヘッダファイルから機械的に置換することを考慮すると・・・)
HiroさんがせっかくHSPの標準命令みたいに短くて分かりやすそうな命令セット(WV2Env等)にして下さったので、
なんとかComCall周りも取っ付きやすくしたかったんですけど。。。
#include "d3m.hsp"
time=d3timer()
repeat 100000
;prm = varptr(visible)
;ComCall ctrl, 3, prm, 1
WV2CCall ctrl, "get_IsVisible", varptr(visible)
loop
title ""+(d3timer()-time)
// ICoreWebView2Controllerの行をComQuery連打の一番最後の行に移動させています。
とかで確認すると10倍以上の差があるので、やはりちょっと現実的ではないかもしれませんね。
コールバックのgosubの中で使われてしまうことを考えると特に。
ComCall:317ms
WV2CCall:7224ms
(予めQueryInterfaceに渡すREFIIDを作っておいてComCallで渡しても1962ms程度でした。)
> (doubleやint64を引数にとるメソッドもありますので厄介です)
int, double 等の混在引数の時に私がよくやる手ですが「一度変数にぶち込んでvartypeを見る」ということで一応対処できたりします。
#module p_cc
#define global CCall2(%1,%2,%3="",%4="",%5="",%6="") dp3@p_cc=%3:dp4@p_cc=%4:dp5@p_cc=%5:dp6@p_cc=%6: CCall2_ %1,%2
#deffunc CCall2_ int this_, int id
num = 0
repeat 1
switch vartype(dp3)
case 4 : prm(num)=dp3 : num++ : swbreak
case 3 : prm(num)=lpeek(dp3,0) : prm(num)=lpeek(dp3,4) : num+=2 : swbreak
default : break
swend
switch vartype(dp4)
case 4 : prm(num)=dp4 : num++ : swbreak
case 3 : prm(num)=lpeek(dp4,0) : prm(num)=lpeek(dp4,4) : num+=2 : swbreak
default : break
swend
switch vartype(dp5)
case 4 : prm(num)=dp5 : num++ : swbreak
case 3 : prm(num)=lpeek(dp5,0) : prm(num)=lpeek(dp5,4) : num+=2 : swbreak
default : break
swend
switch vartype(dp6)
case 4 : prm(num)=dp6 : num++ : swbreak
case 3 : prm(num)=lpeek(dp6,0) : prm(num)=lpeek(dp6,4) : num+=2 : swbreak
default : break
swend
loop
ComCall this_, id, prm, num
return stat
#global
// 8 : put_ZoomFactor
CCall2 ctrl, 8, 0.65
int64 は想像で書きますが、外部プラグインやモジュールを使って、
CCall2 ctrl, 8, HILONG(val), LOLONG(val)
のような記述になるのではないでしょうか。
> 識別されるラベル・変数の最大文字数は59文字(半角)
> ですので注意が必要です。
どうやらモジュール名込みで59文字以下にしないといけないようですね。
ありがとうございます。モジュールも後で修正しておきます。
<誤>
case 3 : prm(num)=lpeek(dp3,0) : prm(num)=lpeek(dp3,4) : num+=2 : swbreak
<正>
case 3 : prm(num)=lpeek(dp3,0),lpeek(dp3,4) : num+=2 : swbreak
ComCallと遜色のない速度 と 分かりやすさ(私が勝手に目指したラインの) の両立は流石にできないな、と現状は感じました。
速度差が結構あるのでどんな状況でも使えるような命令とは言えず、常用は非推奨になるかと思います。
「この追加モジュールを使うとComCallが少しだけ使いやすくなるよ。ただし直接ComCallコマンドを指定するより遅いので
速度を必要とする個所ではComCallの使用をお勧めします。」と注意書きした追加モジュールを残しておいて、
私のComCall周り使いやすさ向上の試みは一旦幕を引こうかと思います。
最後のあがきとして、一度使用したインターフェイスポインタを記憶しておくことで速度の向上を図ってみました。
(双方向循環リスト、、、多分問題なく動いているとは思います。)
・SetMemMax_WV2CCall で記憶数を変更。初期値256。
・前回の10万回試行例で言うと607ms。(まぁ必ず同じ命令(ポインタ)の繰り返しなので。。。例が適当でないです。)
・WV2CCall命令の最後にある「;OutputSohokoJKList 0」のコメントアウトを消すと一覧表示して確認できます。
追加モジュール中身
https://github.com/MIZUSHIKI/HSP-Module/blob/master/plus_wv2ccall.hsp
・ファイル末尾にモジュール中にあるスクリプト塊を生成する方法を載せてあります。
「WebView2.hから、メソッドIndex値を取得」を一部改造させて頂いてます。こちらについても掲載ありがとうございました。
・このモジュールの一部または全部は好きに使ってください。(NYSL)
流用できるところがあればそのまま流用しても良いですし、何かの参考になれば幸いです。
相談に乗ってくださりありがとうございました。
また何か天啓でも閃きましたら改めて報告しに来たいと思います。
ありがとうございます。
> 私のComCall周り使いやすさ向上の試みは一旦幕を引こうかと思います。
お疲れ様でした。大変だったかと思います。
> 相談に乗ってくださりありがとうございました。
いえいえお役に立てず、申し訳ないです。
> また何か天啓でも閃きましたら改めて報告しに来たいと思います。
了解です。