[ 新規に投稿する ]

createobjectのJScript/WebView2の差異No.10506
こみやんま さん 24/12/27 13:17 [ コメントを投稿する ]
  もはやこれに近い話題は3回目か4回目かもしれないですが、
やっぱりWebView2の createobject は何か1つか2つか特定のtypeの時に変換ミスが起きてると思うんですよねぇ
(JScriptはnew ActiveXObjectに乗ってるのと、
 WebView2はサイトー企画完全独自実装だとは思うんですが)

以下の folderObj.Path の部分が「JScript」の時は機能しますが、
「WebView2」とエンジンを書き換えると機能していない。

何かこのあたりでサイトー企画さん側で調べられそうな気もするんですが、
どうでしょうか。
(これだけを実装するなら、もちろん temp 環境変数もってくれば終わりですが、そういうことではなく、
 根本的に、JScriptでは使えて、WebView2にすると、「微妙に使えないCOMメソッドがある」ことが非常に不気味というか...)

まぁ、仕事納めだろうから、すでにお酒入って納会してるかもですがw

jsmode "JScript\\" + currentmacrofilename;

js {

try {
    debuginfo(2);
    var fso = createobject("Scripting.FileSystemObject");
    var filePath = currentmacrofilename();
    console.log(filePath);
    var fileObj = fso.GetFile(filePath);
    console.log(fileObj);
    var directoryPath = fso.GetParentFolderName(filePath);
    console.log(directoryPath);

    console.log(fso.BuildPath(currentmacrodirectory(), currentmacrobasename()));

    // フルパスをJScriptで、ベースと拡張子に分けるには?
    var fileName = fso.GetFileName(filePath); // ファイル名 (拡張子を含む)
    var baseName = fso.GetBaseName(filePath); // 拡張子を除いたファイル名
    var extension = fso.GetExtensionName(filePath); // 拡張子 (ドットを含む)

    console.log(fileName);
    console.log(baseName);
    console.log(extension);

    var folderObj = fso.GetSpecialFolder(2);

    console.log(typeof folderObj);
    console.log(typeof folderObj.Path);

    console.log(folderObj); // これはWebView2では...
    console.log(folderObj.Path); // 特にこちらがWebView2機能しないのが...

} catch (e) {
    console.log(e);
}

} // js
[ ]
RE:10506 createobjectのJScript/WebView2の差異No.10507
秀丸担当 さん 24/12/27 14:13 [ コメントを投稿する ]
  試してみて、そうなることが確認できました。
createobjectはJSCriptでもWebView2でも差異は無く、プログラム的にはIDispatchのバリアント型を渡すというだけになっています。
WebView2の呼び出し方にもクセがあり、呼ばれる側のオブジェクトのネイティブコードにもクセがあるようです。
秀丸エディタ自身が実装するhidemaruオブジェクトなどは、WebView2の呼び出し方にもクセに対応しています。
なんとかできればいいのですが、WebView2と生成されたオブジェクトの間でだけのやりとりになり、間に秀丸エディタが入る余地は無く、どうしようもなさそうです。
[ ]
RE:10506 createobjectのJScript/WebView2の差異No.10510
western さん 24/12/28 08:21 [ コメントを投稿する ]
  jsmode の createobject の話題が出たので便乗です

createobject の基本的な用途が WebView2 では動作せずエラーとなり、JScript なら動作するが
イマドキに必要な機能が揃っていないので関連する処理の実装が難しく遠回り過ぎて面倒くさく
大きなテキスト(バイナリデータ化は更に問題外)を渡すのに非同期モードでは setStaticVariable(,,-1) で受け渡しできず
秀丸マクロのそういうもんだ作法で諦めておりましたが
解決法や修正の可能性はあるのでしょうか?

以下の2つのマクロは JScript であれば動作しますが、WebView2 では動作してくれません

// 秀丸エディタ Version 9.39 32bit edition
debuginfo 2;

jsmode "WebView2"; // WebView2 では Enumerable なコレクションを取り出す方法がない?
js {
  try {
    var fso = hidemaru.createObject("Scripting.FileSystemObject");
    var folders = fso.GetFolder("C:\\").SubFolders;
    for(var objEnum = new Enumerator(folders); !objEnum.atEnd(); objEnum.moveNext()) {
      strFileName = objEnum.item();
      console.log(strFileName);
    }
  } catch (err) { console.log("catch : " + err); }
}

jsmode "WebView2"; // WebView2 では xmlhttp.send(); でエラーとなる
js {
  try {
    var xmlhttp = hidemaruGlobal.createobject("Microsoft.XMLHTTP");
    xmlhttp.open("GET", "https://hide.maruo.co.jp/manual/index.html", false);
    // if WebView2 M:/createobject_test.mac(6) +... TypeError: xmlhttp.send is not a function at eval (eval at <anonymous> (:2:1), <anonymous>:16:11) at <anonymous>:2:1
    xmlhttp.send();
    if (xmlhttp.status != 200) {
      console.log("GET Error: " + xmlhttp.status + " " + xmlhttp.statusText);
    } else {
      console.log("GET Success: " + xmlhttp.status + " " + xmlhttp.responseText.length); // 取得した文字列長
    }
  } catch (err) { console.log("catch : " + err); }
}

[ ]
RE:10510 createobjectのJScript/WebView2の差異No.10511
こみやんま さん 24/12/28 10:40 [ コメントを投稿する ]
  >    xmlhttp.send();

WebView2の時
send() を send にしたりすると、うまくいったりしませんか?w

「は? んなわけw ()評価せずに呼び出されるわけが!!」と思うでしょうが...

[ ]
RE:10511 createobjectのJScript/WebView2の差異No.10512
western さん 24/12/28 11:00 [ コメントを投稿する ]
  試した初期に何か取得できてた一瞬の記憶がありましたが
メソッド呼び出しの括弧忘れバグの副作用だったのかもしれません

ノウハウ持ちのプログラマほどドツボにはまりそうな奇妙な挙動ですね

それでも問題点は使いたいシチュエーションは常に POST リクエストなので xmlhttp.send(content); と引数を渡せないことなのですが、
こちらもエンジニアには思いも付かない解決方法があれば嬉しいです

本来は fetch API の無条件解禁が最高なのですがw
[ ]
RE:10512 createobjectのJScript/WebView2の差異No.10513
こみやんま さん 24/12/28 16:23 [ コメントを投稿する ]
  >本来は fetch API の無条件解禁が最高なのですがw

jsmodeのWebView2(エンジン)では、
fetch は POSTメソッドも使えると思うのですが、
そういうことではなく?

https://hide.maruo.co.jp/lib/macro/hmdeepllangtranslatorjs_1209.html

この辺とかでも、fetch / POST の代表的な使い方の1つですし。


[ ]

[ 新規に投稿する ]