マクロ実行中か、マクロ実行中以外か

概要

この関数は主に「非同期」でマクロを動作させる場合に必要となります。

現代的な作りのエディタ(例えば Visual Studio Code)は、
マクロ(拡張機能用のスクリプト)は何本走ろうが非同期で並列で動作しますが、
残念ながら、古い作りの秀丸は、「全ての秀丸」で1つのマクロ実行枠しかありません。
同時に複数のマクロは並列で実行できないということであり、プログラムで手動で並列実行を避ける必要があります。
(並列実行しようとすると、秀丸がダイアログでエラーを出してしまいます)

並列処理(非同期処理)のようなプログラムをC++で組んでいる場合は、

新たなマクロを実行したいが、今既にマクロが実行中だから出来ない、1秒後に改めて判定しよう。

といった一種の待機処理が必要となるのです。この関数はそういった判断をする際に利用します。

マクロ実行中かどうか

  • C++側のソース

    マクロ中でもマクロ中以外でも、常時取得することが出来ます。

    Hm.Macro.isExecuting()

    利用方法の参考としては、秀丸マクロを改めて実行(ファイル指定編)を参照してください。

    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;
    		}
    
    		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;
    }