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

概要

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

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

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

  • C++側のソース

    dll1.cpp こちらは、dll1.dllとして保存
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    extern "C" __declspec(dllexport) THmNumber test() {
        Hm.funcDllExport();
    
        Hm.Macro.setVar(L"#abc", 300);
    
        return 1;
    }
    
  • C++側のソース

    dll2.cpp こちらは、dll2.dllとして保存
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    extern "C" __declspec(dllexport) THmNumber test() {
        Hm.funcDllExport();
    
        THmNumber b = Hm.Macro.getVar<THmNumber>(L"#abc");
        b += 100;
        Hm.OutputPane.output(to_wstring(b) + L"\r\n");
        return 1;
    }
    
  • 秀丸マクロ側のソース

    HmProcBridgeTest.macなどと適当に名前を付ける
    // 秀丸プロセスA側
    #dll_A = loaddll(currentmacrodirectory + @"\dll1.dll");
    #r = dllfuncw(#dll_A, "test");
    freedll(#dll_A);
    
    // 秀丸プロセスBが誕生
    newfile;
    
    // 秀丸マクロ独特の機能として、プロセスを跨いでも、「秀丸マクロ変数」の値は維持されている、というものがある。
    
    // 秀丸プロセスB側で、秀丸マクロ変数の値を読み込む
    #dll_B = loaddll(currentmacrodirectory + @"\dll2.dll");
    #r = dllfuncw(#dll_B, "test");
    freedll(#dll_B);
    

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

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

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