|
>汎用のobj={}とかary=[]をネイティブ上で作って返すだけでいいのですが、難しい
>ことをせずに簡単にする方法があって知らないだけかもしれないので、もし知って
>いたら教えてもらえると助かります。
担当さんは、恐らくは
WebView2の方は、多分 WebView2のAddHostObjectToScript 使って、
chrome.webview.hostObjectsの下に、hidemaru を COMとしてぶらさせて、
hidemaruがCOMクラスで、そのクラスにhidemaru.****のメソッドやプロパティを
生やしてるんだろうなぁと想像しています。
で、あるとするならば、おそらく
```
「通常のJavaScriptのオブジェクト」をこのCOMから生やしたメソッドやプロパティ
の返り値として
返す方法は「提供されていない」
```
のではないかと思います。
(マイクロソフトのWebView2 SDK開発者に聞くぐらいでないと出てこないかもw)
オブジェクト的に扱えるものが、まさに現在担当さんがされている(runProcessとか
で)もので、
このやり方は(返り値自体がCOMの新たな型ProcessInfoだろうと思いますが)どうしても
その実態は JavaScriptから見ると function といったことになってしまうため、
(ようするに、COMオブジェクト自体はことごとく=native functionであるかのように
JavaScriptからは見えてしまう、JScriptの方は結構Objectとして認識するかとは思
いますが)
基本的には最初から返り値を普通のJavaScriptオブジェクト的に扱わせたいなら
「hidemaru COMクラスを、__hidemaru__みたいにして、JavaScript層(HidemaruJSGlo
ba)で改めてラップしないとちょっと無理筋」といったように思えます。
というかラッピングしない限りは、無限に実装時間が取られてしまうかと...
----------------------------------------------------------------------------
-------
ネイティブ系でいくなら上にもあげた、
```
ネイティブであることが問題なのではなく、
返ってきた値を見ようとしたら、
function () { native code; } と表示されることが懸念点
```
なんで躊躇しているのではないかと思うので
---------------------------------------- COM クラスでいうところの ----------
------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary16
{
[ClassInterface(ClassInterfaceType.None)]
[Guid("E212AE0C-89E1-41E7-BFCF-F26EA189CBD1")]
public class ObjectType : IObjectType
{
public int x
{
get { return 3; }
}
public int y
{
get { return 10; }
}
public string toString()
{
return "{x:3, y:10}";
}
public string toJSON()
{
return "{x:3, y:10}";
}
}
public interface IObjectType
{
int x { get; }
int y { get; }
string toString();
string toJSON();
}
public interface IInstanceType
{
ObjectType getObjType();
string toString();
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("E212AE0C-89E1-41E7-BFCF-F26EA189CBD1")]
public class InstanceType : IInstanceType
{
public ObjectType getObjType()
{
ObjectType c = new ObjectType();
return c;
}
public string toString()
{
return "{元のインスタンスのクラス}";
}
}
}
---------------------------------------- JS側で呼び出すと... ---------------
-------------------------
js {
debuginfo(2);
var i = createobject( currentmacrodirectory() + "\\ClassLibrary16.dll", "Cla
ssLibrary16.InstanceType" );
message(i); // "元のインスタンスのクラス" という文字列が出る。 COMメソッドと
しての、「★★toString上書きの効果★★」
var objtype = i.getObjType();
message(objtype);
console.log(objtype); // {x:3, y:10} COMメソッドとしての、「★★toString上書
きの効果★★」
message(objtype.x); // 3
message(objtype.y); // 10
var b = objtype.toString(); // {x:3, y:10}
message(b); // {x:3, y:10}
message(JSON.stringify(b)); //"{x:3, y:10}"COMメソッドとしての、「★★toJSON
上書きの効果★★」
}
みたいに、toStringとtoJSONを偽装して緩和するしかないかと。
しかしながら、個人的にはこのやり方よりは、
素直にラップした方が実装速度もはるかに速く、柔軟性も高いかと思います。
|
|