javascriptマクロでV8使用時にactivexオブジェクトを使いたい
-
Windows11:64bit
Mery3.7.11:64bitWSHの時は
obj=new ActiveXObject( "ID" )
で呼び出せました。
#language = "V8"でやった時に、ActiveXオブジェクトを使う方法はありますか?| yoshi | 返信 -
残念ながら、V8 では
ActiveXObject
を使うことはできません。ActiveXObject
は Windows の COM (Component Object Model) を使うための仕組みですが、V8 は Google Chrome や Node.js で使われる JavaScript エンジンで、Windows だけでなく Linux や macOS など、いろんな環境で動きます。そのため、ActiveX のような Windows 専用の機能は最初からサポートされていないんです。
ちなみに、用途によっては
ActiveXObject
を使わずに代替手段を利用できます。たとえば、アプリを起動したり、ファイルがあるかチェックしたりするくらいなら、
shell
オブジェクトで代用できます。アプリを起動する:
// ActiveXObject を使う場合 var ws = new ActiveXObject("WScript.Shell"); ws.Run("notepad.exe";
↓
// shell オブジェクトを使う場合 shell.Run("notepad.exe");
ファイルの存在をチェックする:
// ActiveXObject を使う場合 var fso = new ActiveXObject("Scripting.FileSystemObject"); if (fso.FileExists("a.txt")) { alert("False"); }
↓
// shell オブジェクトを使う場合 if (!shell.FileExists("a.txt")) { alert("False"); }
【参考】https://www.haijin-boys.com/wiki/マクロリファレンス:3:Shell_オブジェクト
ただ、
ActiveXObject
じゃないとどうしてもできないこともあるので、その場合は、V8 ではなく JScript を使うのがいいかもしれません。| Kuro | 返信 -
ネットで検索すると、activexは廃止の方向ですね。githubにjavascriptのライブラリが無数にあるので、それを#includeで使う方向で行こうと思いました。
| yoshi | 返信 -
ご返信ありがとうございます。
> ネットで検索すると、activexは廃止の方向ですね。
そうですね。それに加えて、VBScript も廃止が決まっているので、WSH (JScript) もそのうち終わっちゃう可能性が高いですね。
そうなると、Mery のマクロもほぼ全滅してしまうので、Mery も巻き添えで終了…なんてことになりかねません。
そのときのために V8 エンジンを用意しているのですが、今のところネイティブ実装は難しくて、WebView2 を使って動かしてるので、ちょっと重めなのが悩みどころです。
> githubにjavascriptのライブラリが無数にあるので、それを#includeで使う方向で行こうと思いました。
おっしゃる通り V8 は便利なライブラリがたくさんあるので、できることは増えてますね。
とはいえ、セキュリティが厳しくなってるので、ローカルファイルへのアクセスとかはなかなか難しいですが…
あと、Mery の V8 は Node.js のライブラリとは互換性がないので、その点だけはお気をつけください。
| Kuro | 返信