秀丸マクロを改めて実行(ファイル指定編)

概要

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

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

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

ここでは、ファイルを指定して実行する方法を示します。

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

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

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

    dllmain.cpp
    #include "HmCppInvoke.h"
    #include <thread>
    
    using namespace Hidemaru;
    using namespace std;
    
    bool bThreadCenceller = false;
    const int sleepInterval = 1000;
    HANDLE hThread = NULL;
    
    wstring currentmacrodirectory = L"";
    
    DWORD WINAPI ThreadFunc(LPVOID pParam)
    {
    
        while (true) {
            Sleep(sleepInterval);
    
            if (bThreadCenceller) {
                break;
            }
    
            if (!Hm.Macro.isExecuting()) {
    
                wstring dir = currentmacrodirectory;
    
                // 「あいうえお」という文字列を編集中のテキストに挿入。
                auto result = Hm.Macro.Exec.doFile(dir + L"/SubTest.mac");
    
                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();
    
        currentmacrodirectory = Hm.Macro.getVar<wstring>(L"currentmacrodirectory");
    
        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()メソッド

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

  • C++からHm.Macro.Exec.doFile(...)される秀丸マクロ側のソース

    C++のソース中に従う。今回の例では、SubTest.macというファイル名
    debuginfo 2;
    debuginfo "test test\n";
    
    endmacro "最後まで実行出来た";
    

    通常の秀丸マクロと同じですが、endmacroの最後に文字列を引数としておくことで、
    該当のendmacroまで実行した時に、その文字列を取得することが出来ます。

  • 秀丸マクロ側のソース

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