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

  • 概要

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

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

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

    • C#側のソース

      MyTestForm.cs こちらは、ProcessA.dllとして保存
      using System;
      using System.Windows.Forms;
      using Hidemaru;
      
      namespace HmTest
      {
          partial class HmTestForm
          {
              protected void MethodCreate()
              {
                  Hm.Macro.Var["#abc"] = 300;
              }
              protected void MethodTick()
              {
              }
              protected void MethodDestroy()
              {
              }
          }
      
      }
      
      
    • C#側のソース

      MyTestForm.cs こちらは、ProcessB.dllとして保存
      using System;
      using System.Windows.Forms;
      using Hidemaru;
      
      namespace HmTest
      {
          partial class HmTestForm
          {
              protected void MethodCreate()
              {
                  var b = (int)(dynamic)Hm.Macro.Var["#abc"];
                  b += 1000;
                  System.Diagnostics.Trace.WriteLine(b);
              }
              protected void MethodTick()
              {
              }
              protected void MethodDestroy()
              {
              }
          }
      
      }
      
      
    • 秀丸マクロ側のソース

      HmProcBridgeTest.macなどと適当に名前を付ける
       // 秀丸プロセスA側
      #HMNET_A = loaddll( hidemarudir + @"\hm.NET.dll" );
      
      // 秀丸プロセスA側で、秀丸マクロ変数に値を書き込む
      #r = dllfuncw( #HMNET_A, "SetDetachMethod", currentmacrodirectory + @"\ProcessA.dll", "HmTest.HmTestClass", "OnDetathMethod" );
      #r = dllfuncw( #HMNET_A, "CallMethod", currentmacrodirectory + @"\ProcessA.dll", "HmTest.HmTestClass", "CreateForm" );
      
      // 秀丸プロセスBが誕生
      newfile;
      
      // 秀丸マクロ独特の機能として、プロセスを跨いでも、「秀丸マクロ変数」の値は維持されている、というものがある。
      
      // 新たなプロセスなので改めて hm.NET.dllも読み込む必要がある。
      #HMNET_B = loaddll( hidemarudir + @"\hm.NET.dll" );
      
      // 秀丸プロセスB側で、秀丸マクロ変数の値を読み込む
      #r = dllfuncw( #HMNET_B, "SetDetachMethod", currentmacrodirectory + @"\ProcessB.dll", "HmTest.HmTestClass", "OnDetathMethod" );
      #r = dllfuncw( #HMNET_B, "CallMethod", currentmacrodirectory + @"\ProcessB.dll", "HmTest.HmTestClass", "CreateForm" );
      

      一度マクロを実行し、「デバッグモニター」にどのように順次表示されるか確認しましょう。

      デバッグモニターには1300と表示されます。

      プロセスAのdllで秀丸マクロ変数へと書き込んだ値が、秀丸マクロという独特なプロセスを跨ぐという特性を利用して、
      プロセスBのdllへと伝搬される様子が確認出来るかと思います。