秀丸マクロ上の静的な変数の値を読み取る・書き換える (秀丸エディタ 9.15以降)

概要

hm.NETでは秀丸マクロの「静的な変数」を常時読み書きすることが出来ます。
秀丸マクロの「静的な変数」とは、秀丸マクロでいうところの setstaticvariable 文getstaticvariable 関数 で対象となっている変数に相当します。)

秀丸マクロ上の静的な変数の値を読み取る・書き換える

マクロ実行中のみ、読み取り・書き換え可能

string Hm.Macro.StaticVar.Get( string key, int sharedflag )
bool Hm.Macro.StaticVar.Set( string key, string value, int sharedflag )
共用メモリのタイプを表す最後の引数 上述の getstaticvariable や setstaticvariable の解説を見ればわかりますが、
最後の引数に -1 を指定することで、「該当のプロセスのみ」「マクロ実行中のみ」という変数のライフサイクルとなる一方で、
該当の静的変数はメモリ制限のない状態に出来ます。
(静的変数は32767個までという制限はある)
(厳密にはWindowsのアプケーションとしてのメモリ制限は受けます)
  • C#側のソース

    .NET5ではなく、.NET Framework 4.xで作成したと過程
    using System;
    using System.Runtime.InteropServices;
    using HmNetCOM;
    
    namespace NET4COMServer
    {
        [Guid("C48791B2-D852-401D-AF6A-566D0FCA20D8")]
        public class NET4COMServer
        {
            public String test()
            {
                try
                {
                    bool b = Hm.Macro.StaticVar.Set("hoge", "あいうえお", -1);
                    string ret = Hm.Macro.StaticVar.Get("hoge", -1);
                    Hm.OutputPane.Output("テスト");
                    return ret;
                }
                catch (Exception e)
                {
                    Hm.OutputPane.Output(e.Message);
                }
                return "";
            }
        }
    }
    
  • 秀丸マクロ側のソース

    HmClassTest.macなどと適当に名前を付ける
    #obj = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer" );
    $result1 = member(#obj, "test");
    message getstaticvariable("hoge", -1);
    message $result1;
    
  • C#側のソース

    string Hm.Macro.StaticVar[ string key, int sharedflag ]
    void Hm.Macro.StaticVar[string key, int sharedflag ] = value
    StaticVar[varname, sharedscope]という形も可能
        using System;
        using System.Runtime.InteropServices;
        using HmNetCOM;
        
        namespace NET4COMServer
        {
            [Guid("C48791B2-D852-401D-AF6A-566D0FCA20D8")]
            public class NET4COMServer
            {
                public String test()
                {
                    try
                    {
                        Hm.Macro.StaticVar["hoge", -1] = "あいうえお";
                        string ret = Hm.Macro.StaticVar["hoge", -1];
                        Hm.OutputPane.Output("テスト");
                        return ret;
                    }
                    catch (Exception e)
                    {
                        Hm.OutputPane.Output(e.Message);
                    }
                    return "";
                }
            }
        }