V9.32β5No.11611
秀丸担当 さん 24/03/22 15:06
 
V9.32β5を公開しました。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm932b5_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hm932b5_x64_signed.exe

[ ]
RE:11611 V9.32β5No.11612
こみやんま さん 24/03/27 10:04
 
以前もさりげなく投稿していたのですが、
「webview2」の「jsmode」の「createobject」で、

「.NET 5〜」系の実行( ****.comhost.dll)の実行は出来ないものなんでしょうか。

「秀丸マクロ」の方では、
https://help.maruo.co.jp/hidemac/html/230_Com_createobject_dotnet5.html
で対応していたので、jsmode&webview2でも対応可能ではないのか?
とも思えるんですけれども。




[ ]
RE:11612 V9.32β5No.11613
秀丸担当 さん 24/03/27 11:03
 
createobjectは一応jsmodeであっても差異無く使えるはずと思っています。
もし.comhost.dllの場合だけできないとか、WebView2の場合だけできないということ
があるとしたら、何か想定していないバグか何かがあるのかもしれません。
WebView2の場合だけ違いが出る場合があるでしょうか?

[ ]
RE:11613 V9.32β5No.11615
秀丸担当 さん 24/03/27 14:51
 
改めてインストールとかしてやってみたら、確かにWebView2の場合はうまくいきませ
んでした。

なぜか、aaa=obj.TestMethod();とするべきところを、aaa=obj.TestMethod;とすると
いちおうパラメータなしではできるようでした。
前にもなにか、WebView2の呼び出し方にクセがあるというか、IDispatchのプロパテ
ィとメソッドがごっちゃになっているところがあって、秀丸エディタが作るrunProce
ss等のインスタンスはそれになんとか対応してたという気がします。
COMオブジェクトの存在と呼び元のWebView2の間では秀丸エディタは無くて、これを
なんとかするのは難しそうです。

[ ]
RE:11615 V9.32β5No.11617
こみやんま さん 24/03/27 15:51
 
>なぜか、aaa=obj.TestMethod();とするべきところを、aaa=obj.TestMethod;とする
>といちおうパラメータなしではできるようでした。

確かにプロパティだと上手くいきますねぇ。

https://github.com/komiyamma/hm_webview2_net6_com_error/tree/main/NET6COMServer/bin/Release/net6.0


・hidemac.mac
・jscript.mac
・webview2.mac
・webview2_property.mac

で試しました。

- リポジトリ  
  https://github.com/komiyamma/hm_webview2_net6_com_error/
- ソース  
  https://github.com/komiyamma/hm_webview2_net6_com_error/blob/main/NET6COMServer/NET6COMServer.cs
- csプロジェクト  
  https://github.com/komiyamma/hm_webview2_net6_com_error/blob/main/NET6COMServer/NET6COMServer.csproj


現状
■JSCript
- .NET4.x   ◎ (すごく◎完璧) 互いに互いのオブジェクトだろうが関数だろうが、
扱える。
- .NET5以降 ◎ (すごく◎完璧) 互いに互いのオブジェクトだろうが関数だろうが、
扱える。

■WebView2
- .NET4.x   △  関数呼び出しやプロパティなど、「プリミティブ型の引数や返り
値」のみ扱える。IDispatchが付いたオブジェクトが挟まるとコケる)
- .NET5以降 ×  関数呼び出し不可。プロパティのget/setで「プリミティブ型」か
「プリミティブの配列型」なら扱える)

っていうのが現状っぽいです。



[ ]
RE:11617 V9.32β5No.11618
秀丸担当 さん 24/03/28 09:51
 
>■WebView2
>- .NET4.x   △  関数呼び出しやプロパティなど、「プリミティブ型の引数や返り
>値」のみ扱える。IDispatchが付いたオブジェクトが挟まるとコケる)
>- .NET5以降 ×  関数呼び出し不可。プロパティのget/setで「プリミティブ型」か
>「プリミティブの配列型」なら扱える)

..net 4のIDispatchのパラメータはちょっとわからないですが、.net 5のプロパティ
はそうなのですね。
前に調べたことがあるので、WebView2とJScriptのプロパティとメソッドの違い以下
のような感じでした。

-------------

未知の関数が呼ばれる場合の手続き

●WSHの場合
1.GetIDsOfNames
-.GetTypeInfoCount 来ない
2.GetTypeInfo TYPE_E_ELEMENTNOTFOUND
3.Invoke
    wFlags = DISPATCH_METHOD | DISPATCH_PROPERTYGET
            0x1| 0x2
    パラメータ個数正常

●WebView2の場合
1.GetIDsOfNames
2.GetTypeInfoCount 0個でS_OK
3.Invoke プロパティ
    wFlags = DISPATCH_PROPERTYGET
              0x2
    パラメータ0個
    DISP_E_MEMBERNOTFOUND 0x80020003(メンバが見つかりません)を返すと、4.のメ
ソッドで再試行される
4.Invoke メソッド
    wFlags = DISPATCH_METHOD
              0x1
    パラメータ個数正常

-------------

ごっちゃになっていたのはWSH(JScript)のほうで、WebView2はクセがあるというより、
むしろプロパティとメソッドを明確に分けていました。
COMオブジェクト側がWSH等のごっちゃにしたものにしか想定していないと、3.の段階
でDISP_E_MEMBERNOTFOUNDではなく、別のエラーで返して4.まで行かず、プロパティ
になってしまうようです。

..net 5はサポート切れということですが、.net 6とか8はサポートしているという話
なので、それで直してもらうしかなさそうです。

[ ]
RE:11618 V9.32β5No.11619
こみやんま さん 24/03/29 08:18
 
>●WebView2の場合
>1.GetIDsOfNames
>2.GetTypeInfoCount 0個でS_OK
>3.Invoke プロパティ
>    wFlags = DISPATCH_PROPERTYGET
>              0x2
>    パラメータ0個
>    DISP_E_MEMBERNOTFOUND 0x80020003(メンバが見つかりません)を返すと、4.の
>メソッドで再試行される
>4.Invoke メソッド
>    wFlags = DISPATCH_METHOD
>              0x1
>    パラメータ個数正常


うーむ、なんででしょうねぇ。うーむ。
(前の投稿でgithubに上げたものは .NET5ではなく、[アドレスからもわかる通り].NE
T6 のものですが、.NET8でも動作などは変化はありません)

C++/C#側から(WebViewをコントロールしている側から)、AddHostObjectToScript を
経由してJS空間へと登録した
COMコンポーネントについては、(チェックしてないですが常識的に考えて)メソッド
も動作しているでしょうに、何が違うんだろ
(それらのソース見てる分には特別なアトリビュートとか付けてないんですよねー)

まぁとりあえず、プロパティのget/set が機能するなら、
FuncArg1プロパティ、FungArg2プロパティ、Funcプロパティとか用意すれば、

function abc(arg1, arg2) {
    com.FuncArg1 = arg1;
    com.FuncArg2 = arg2;
    return com.Func;
}

みたいにすれば機能するといえば、機能するので、まぁなんとかなってるんでないの、
と言えなくはないレベルだとは思います。
(呼び出し部分だけの問題で、そこから先は普通に.NETによる制作のしやすさの恩恵
があるなら上記ハンデ程度なら傷は浅い)


[ ]