秀丸マクロを改めて実行(ファイル指定編)

概要

秀丸マクロが実行されていない時、秀丸マクロを改めて実行する」ことが出来ます。

マクロを実行していない時にのみ、実行可能なため、
ほとんどのシチュエーションでは「async await Task.Run Thread Timer」といったものをキーワードとする
「非同期のメソッド」にて使うこととなるでしょう。

文字列を記述して直接実行することもできますし、
ファイルを指定して実行することもできます。

ここでは、ファイルを指定して実行する方法を示します。

秀丸マクロファイルを改めて実行

マクロを実行していない時にのみ、実行することが出来ます。

Hm.Macro.Exec.File("マクロファイルのフルパス")
  • C#側のソース

    MyTestForm.cs
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using HmNetPInvoke;
    
    namespace NET4COMServer
    {
        [Guid("986F16AF-42EC-4F33-9F94-0ACA08EA0A87")]
        public class NET4COMServer
        {
            // 確認しやすいようコンソール表示のため
            [DllImport("kernel32.dll")]
            private static extern bool AllocConsole();
    
            // 静的コンストラクタ(static付きコンストラクタ)でコンソール表示を読んでおけば良い。
            static NET4COMServer()
            {
                AllocConsole();
            }
    
            // 非同期のメソッド
            static string HeavyMethod()
            {
                Thread.Sleep(2000);
    
                // このdllがあるディレクトリ
                string asmLocation = System.Reflection.Assembly.GetExecutingAssembly().Location;
                string dir = System.IO.Path.GetDirectoryName(asmLocation);
    
                // マクロを実行していない時
                if (!Hm.Macro.IsExecuting)
                {
                    // 「SubTest.mac」を実行
                    var result = Hm.Macro.Exec.File(dir + "/" + "SubTest.mac");
    
                    if (result.Message == "最後まで実行出来た")
                    {
                        Console.WriteLine("実行成功");
                    }
                    else
                    {
                        Console.WriteLine("実行失敗");
                    }
                }
                System.Diagnostics.Trace.WriteLine("非同期関数");
    
                return "非同期関数";
            }  
    
            // COM呼び出しだとstaticを付けては駄目。一方、hm.NETやDllExport.batの場合はstaticが必要。
            public string CalledFuncFromHidemaruMacro()
            {
                Task<string> task = Task.Run(() => {
                    return HeavyMethod();
                });
    
                // awaitやTaskのResult待ちしないので、この関数自体は一瞬で抜けていく。
                return "同期関数";
            }
        }
    }
    
    • endmacro の後ろの文字列

      「秀丸マクロ内の endmacro の後ろの文字列 が肝となります。

    • Messageプロパティ

      endmacroまで実行できたならば、Messageプロパティにその値が入っていることでしょう。

    • Errorプロパティ

      何か明確な例外が発生した場合はErrorプロパティに例外を捕捉出来ることもありますが、
      情報としての確実性に欠けます。
      原則的には、「endmacroの後ろの文字列」でどこまで実行できたのかを、把握するのが適切です。

    • Resultプロパティ

      実行の状態によって返ってくる値が異なります、参考程度の値であり、あまりこの値に基づいたプログラムを記述するべきではありません。

  • C#から実行される秀丸マクロ側のソース

    C#のソース中に従う。今回の例では、SubTest.macというファイル名
    debuginfo 2;
    debuginfo "test test\n";
    
    endmacro "最後まで実行出来た";
    

    通常の秀丸マクロと同じですが、endmacroの最後に文字列を引数としておくことで、
    該当のendmacroまで実行した時に、その文字列を取得することが出来ます。