秀丸マクロ変数はプロセスを跨ぐバッファー

概要

とある「秀丸のプロセスAの.dll内の値」→「別秀丸のプロセスBのマクロ変数」へと値を伝搬するのに、
秀丸マクロ変数を使うことが出来ます。

プロセスを越えた値の伝搬

2つのdllを用意してみましょう。

  • C#側のソース

    MyTest.cs こちらは、NET4COMServer.dllとして保存
    using System;
    using System.Runtime.InteropServices;
    using HmNetCOM;
    
    namespace NET4COMServer
    {
        [ComVisible(true)]
        [Guid("BD55F2A6-9ED0-4F4F-9D37-E6B84BE63272")]
        public class NET4COMServer 
        {
            public long SetMyVariable()
            {
                int myvariable = 300;
                Hm.Macro.Var["#MyVariable"] = myvariable;
                Hm.OutputPane.Output($"{myvariable}\r\n");
                return 1;
            }
    
            public long GetMyVariable()
            {
                int myvariable = (int)(dynamic)Hm.Macro.Var["#MyVariable"];
                Hm.OutputPane.Output($"{myvariable}\r\n");
                return 1;
            }
    
        }
    }
    
  • 秀丸マクロ側のソース

    HmProcBridgeTest.macなどと適当に名前を付ける
     // 秀丸プロセスA側
    #obj_A = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");
    #r_A = member(#obj_A, "SetMyVariable");
    releaseobject #obj_A;
    
    // 秀丸プロセスBが誕生
    newfile;
    
    // 秀丸マクロ独特の機能として、プロセスを跨いでも、「秀丸マクロ変数」の値は維持されている、というものがある。
    #MyVariable = #MyVariable + 1000;
    
    // 新たなプロセスなので改めて createobjectする必要がある。
    #obj_B = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");
    #r_B = member(#obj_B, "GetMyVariable");
    releaseobject #obj_B;
    

    一度マクロを実行し、「アウトプット枠」にどのように順次表示されるか確認しましょう。

    最初に300、次に1300と表示されます。

    プロセスAのdllで秀丸マクロ変数へと書き込んだ値が、「秀丸マクロという独特なプロセスを跨ぐというバッファー」であるかのような特性を利用して、
    プロセスBのdllで取得できることがわかるかと思います。