この関数は主に「非同期」でマクロを動作させる場合に必要となります。
現代的な作りのエディタ(例えば Visual Studio Code)は、 マクロ(拡張機能用のスクリプト)は何本走ろうが非同期で並列で動作しますが、 残念ながら、古い作りの秀丸は、「全ての秀丸」で1つのマクロ実行枠しかありません。 同時に複数のマクロは並列で実行できないということであり、プログラムで手動で並列実行を避ける必要があります。 (並列実行しようとすると、秀丸がダイアログでエラーを出してしまいます)
並列処理(非同期処理)のようなプログラムをC++で組んでいる場合は、
新たなマクロを実行したいが、今既にマクロが実行中だから出来ない、1秒後に改めて判定しよう。
といった一種の待機処理が必要となるのです。この関数はそういった判断をする際に利用します。
マクロ中でもマクロ中以外でも、常時取得することが出来ます。
Hm.Macro.isExecuting()
利用方法の参考としては、秀丸マクロを改めて実行(ファイル指定編)を参照してください。
#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; } auto inMacro = Hm.Macro.isExecuting(); Hm.OutputPane.output(L"非同期関数中でマクロ実行中?:" + to_wstring(inMacro) + L"\r\n"); } Hm.OutputPane.output(L"スレッドが終了"); return 0; // スレッド終了 } extern "C" __declspec(dllexport) THmNumber DllDetachFunc_After_Hm866(THmNumber n) { Hm.funcDllExport(); bThreadCenceller = true; WaitForSingleObject(hThread, sleepInterval * 2); MessageBox(NULL, to_wstring(n).data(), L"DllDetachFunc_After_Hm866", NULL); if (n == 1) { // 8.66以降。freedll } else if (n == 2) { // 8.66以降。loaddll文による入れ替え } else if (n == 3) { // 8.66以降。マクロから呼び出したdllが、プロセス終了時にまだロードされた状態であれば、この値で呼び出される } else if (n == 4) { // 8.98以降。keepdll #dll, 0; のエラー発生時解放が指定してあり、エラーが発生した理由によりマクロが終了し、dllが解放されようとしている時 } else { // 未知の終了理由 } return 0; } extern "C" __declspec(dllexport) THmNumber test() { Hm.funcDllExport(); bThreadCenceller = false; hThread = CreateThread( NULL, 0, ThreadFunc, NULL, 0, NULL ); auto inMacro = Hm.Macro.isExecuting(); Hm.OutputPane.output(L"同期関数中でマクロ実行中?:" + to_wstring(inMacro) + L"\r\n"); Hm.OutputPane.output(L"test関数の終了直前\r\n"); return 1; }