/mf 再び

  1. kuro さま、改めてこんにちは
    こんなマクロを /mf で指定して実行すると
    try{
      var xlApp=new ActiveXObject('Excel.Application');
      alert(xlApp.Name);
      xlApp.Quit();
    }catch(e){
      alert(e);
    }
    var shApp = new ActiveXObject("Shell.Application");
    try{
      alert(shApp.Windows().Count);
    }catch(e){
      alert(e);
    }
    mery が未起動の状態では成功しますが、起動済みの mery があると[Object Error]
    を吐きます。InternetExplorer.Application や Word.Application でも同等。
    不思議なのは Shell.Application だとロードした時点ではエラーにならず、いくつか
    のプロパティを参照した時点でエラーを吐くところ。

    これが解決すると、アクティブドキュメントのウインドウタイトル取得を
    ↓の関数でも実現できます。
    function getActiveWindowTitleXL(){
      try{
        var xlApp = new ActiveXObject('Excel.Application');
        var hWnd = xlApp.ExecuteExcel4Macro('CALL("user32", "FindWindowA", "JCJ","TChildForm",0)');
        if(hWnd==0)return false;
        var title = xlApp.ExecuteExcel4Macro('CALL("user32", "GetWindowTextA", "2JCJ",' + hWnd + ',"wt",256)');
        return title.replace(/[ \*]*- Mery/,'');
        xlApp.Quit();
      }catch(e){
        alert(e);
      }
    }

     |  匿名です  |  返信
  2. こんばんは、書き込みありがとうございます。

    > mery が未起動の状態では成功しますが、起動済みの mery があると[Object Error]
    > を吐きます。InternetExplorer.Application や Word.Application でも同等。

    こちらでも試してみました。

    起動済みの Mery がある状態でコマンドプロンプトなどから Mery.exe を叩くと、Mery.exe と起動済みの Mery の間でプロセス間通信を使用して引数を飛ばしています (これは一般的に使用される方法です) が、プロセス間通信中は ActiveXObject の生成に失敗するようですね。

    起動時マクロで js が使用できる他のエディタで試してみましたが、同様のエラーが発生するようなのでマイクロソフトの強い力を感じます。

    外部からの不正なスクリプトの実行を防ぐための Windows のセキュリティ的な仕様なのかもしれません。

     |  Kuro  |  返信
  3. わざわざ他のエディタでも追試していただきありがとうございます。

    Scripting.FileSystemObject など一見問題なさそうな ActiveX オブジェクトも
    あるので、Excel.Application などがどこかで接続を deny しているのだろうと
    推測しています。だとすると mery さんの側では手の打ちようがないのかな。
    凝ったマクロファイルを /mf で実行するというのはレアケースと思うので FAQ
    案件で十分と考えます。
    ただ、Shell.Application のようなケースではエラーが MS の仕様のせいだと
    気づくのは難しいんですよね。涙

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

    > だとすると mery さんの側では手の打ちようがないのかな。

    そうなりますね。
    残念ながら今のところは対策のしようがないかと思います。

    実験的に、タイマーを使用してプロセス間通信が終わったころを見計らって自動的にマクロを実行させるようなプログラムを組んでみたところ動くことは動きましたが… ^^;

    セキュリティホールを開けることになりそうですし、ファイルに対してのマクロ発動などのプロセス間通信で使用できていた機能がつぶれちゃうので、ちょっと厳しいっぽいですね。

    > ただ、Shell.Application のようなケースではエラーが MS の仕様のせいだと
    > 気づくのは難しいんですよね。涙

    難しいところですね。
    js の挙動に関しては MS のエンジンにぶん投げてるだけなので内部の仕様までは把握できていませんし、そこまでのサポートはちょっと厳しいです (´;ω;`)

     |  Kuro  |  返信