最終更新日 2021-08-15

秀丸マクロを改めて実行(文字列編)

概要

秀丸マクロが実行されていない時、秀丸マクロを改めて実行する」ことが出来ます。

マクロを実行していない時にのみ、実行可能なため、
ほとんどのシチュエーションでは「非同期のメソッド」にて使うこととなるでしょう。

文字列を記述して直接実行することもできますし、
ファイルを指定して実行することもできます。

ここでは、文字列で実行する方法を示します。

秀丸マクロファイルを改めて実行

マクロを実行していない時にのみ、実行することが出来ます。

decltype(Hm.Macro)::IResult Hm.Macro.Exec.doEval(wstring expression)
  • C++側のソース

    dllmain.cpp
    #include "HmCppInvoke.h"
    #include <thread>
    
    using namespace Hidemaru;
    using namespace std;
    
    bool bThreadCenceller = false;
    const int sleepInterval = 1000;
    HANDLE hThread = NULL;
    
    DWORD WINAPI ThreadFunc(LPVOID pParam)
    {
    
        while (true) {
            Sleep(sleepInterval);
    
            if (bThreadCenceller) {
                break;
            }
    
            // 新規のマクロ空間として実行できる条件とは、現在マクロが実行「されていない」こと。
            if (!Hm.Macro.isExecuting()) {
                // 「あいうえお」という文字列を編集中のテキストに挿入。
                auto result = Hm.Macro.Exec.doEval(LR"MACRO(
                    $test_mes = "あいうえお";
                    insert $test_mes;
                    endmacro "最後まで実行出来た";
                )MACRO");
    
                if (result.getMessage() == L"最後まで実行出来た")
                {
                    Hm.OutputPane.output(L"実行成功\r\n");
                }
                else
                {
                    Hm.OutputPane.output(L"実行失敗\r\n");
                }
            }
        }
    
        Hm.OutputPane.output(L"スレッドが終了");
        return 0;
        // スレッド終了
    }
    
    extern "C" __declspec(dllexport) THmNumber DllDetachFunc_After_Hm866(THmNumber n) {
    
        Hm.funcDllExport();
    
        // スレッドを必ず終了させてから、dllが解放されるようにしておかないと飛んでしまう。
        bThreadCenceller = true;
        WaitForSingleObject(hThread, sleepInterval * 2);
    
        return 0;
    }
    
    extern "C" __declspec(dllexport) THmNumber test() {
    
        Hm.funcDllExport();
    
        bThreadCenceller = false;
    
        hThread = CreateThread(
            NULL,
            0,
            ThreadFunc,
            NULL,
            0,
            NULL
        );
    
        Hm.OutputPane.output(L"test関数の終了直前\r\n");
    
        return 1;
    }
    
    • endmacro の後ろの文字列

      「秀丸マクロ内の endmacro の後ろの文字列 が肝となります。

    • getMessage()メソッド

      endmacroまで実行できたならば、getMessage()でその値を取得できることでしょう。

    • getError()メソッド

      何か明確な例外が発生した場合はErrorプロパティに例外を捕捉出来ることもありますが、
      情報としての確実性に欠けます。
      原則的には、「endmacroの後ろの文字列」でどこまで実行できたのかを、把握するのが適切です。

    • getResult()メソッド

      実行の状態によって返ってくる値が異なります、参考程度の値であり、あまりこの値に基づいたプログラムを記述するべきではありません。

  • 秀丸マクロ側のソース

    test.mac
    #dll = loaddll(currentmacrodirectory + @"\dll1.dll");
    #r = dllfuncw(#dll, "test");