[ 新規に投稿する ]

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のプロパティとメソッドがごっちゃになっているところがあって、秀丸エディタが作るrunProcess等のインスタンスはそれになんとか対応してたという気がします。
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ではなく、[アドレスからもわかる通り].NET6 のものですが、.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による制作のしやすさの恩恵があるなら上記ハンデ程度なら傷は浅い)

[ ]

[ 新規に投稿する ]