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

概要

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

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

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

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

    Dll1.cpp
    #include <windows.h>
    
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    std::wstring ret = L"";
    extern "C" _declspec(dllexport) wchar_t* abc() {
        Hm.funcDllExport();
    
        ret.clear();
        Hm.Macro.setStaticVar(L"abc", L"あいうえお", -1);
        auto r = Hm.Macro.getStaticVar(L"abc", -1);
        ret = r;
        return ret.data();
    }
    
  • 秀丸マクロ側のソース

    HmClassTest.macなどと適当に名前を付ける
    #dll = loaddll( currentmacrodirectory + @"\Dll11.dll" );
    
    $_ = dllfuncstrw(#dll, "abc");
    
    message($_);
    
    message getstaticvariable("abc", 1);
    
    freedll(#dll);