javascriptマクロでV8使用時にactivexオブジェクトを使いたい

  1. Windows11:64bit
    Mery3.7.11:64bit

    WSHの時は
    obj=new ActiveXObject( "ID" )
    で呼び出せました。
    #language = "V8"でやった時に、ActiveXオブジェクトを使う方法はありますか?

     |  yoshi  |  返信
  2. 残念ながら、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  |  返信
  3. ネットで検索すると、activexは廃止の方向ですね。githubにjavascriptのライブラリが無数にあるので、それを#includeで使う方向で行こうと思いました。

     |  yoshi  |  返信
  4. ご返信ありがとうございます。

    > ネットで検索すると、activexは廃止の方向ですね。

    そうですね。それに加えて、VBScript も廃止が決まっているので、WSH (JScript) もそのうち終わっちゃう可能性が高いですね。

    そうなると、Mery のマクロもほぼ全滅してしまうので、Mery も巻き添えで終了…なんてことになりかねません。

    そのときのために V8 エンジンを用意しているのですが、今のところネイティブ実装は難しくて、WebView2 を使って動かしてるので、ちょっと重めなのが悩みどころです。

    > githubにjavascriptのライブラリが無数にあるので、それを#includeで使う方向で行こうと思いました。

    おっしゃる通り V8 は便利なライブラリがたくさんあるので、できることは増えてますね。

    とはいえ、セキュリティが厳しくなってるので、ローカルファイルへのアクセスとかはなかなか難しいですが…

    あと、Mery の V8 は Node.js のライブラリとは互換性がないので、その点だけはお気をつけください。

     |  Kuro  |  返信
スポンサーリンク