|
Hidemaru_EvalMacro にて「型」エラーなど、マクロがストップしてしまうような
エラーが起きた際、dll解放も含めて解放系処理の一部が実行されていないように思
えます。
■エラー概要
・Hidemaru_EvalMacro内でマクロストップを伴うエラーの際、
「解放系処理の一部(※1)」がなされない疑惑。
(おそらく秀丸v8.66以降ずっとあるバグ)
・※1は、dllの解放だけではなく、マクロハンドル解放処理、マクロキャッシュ解放
処理など、
何か通過すべき「一連の解放処理」がごっそり抜けているように思えます。
・ミクロな処理を組んでみたところ、
dllが解放されない現象が100%発生するサンプルとなりました。
(比較的大型のソースでよければ、Hidemaru_EvalMacroのエラーがきっかけで
編集ペインが機能しなくなるのを100%再現できるソースをお渡しできます。た
だしおそらくは原因の根は今回のミニマムサンプルと同じではないかと推察します)
■再現ソースなど
・専用リポジトリ
https://github.com/komiyamma/hidemaru_eval_bug
・.dllソース(C++)
https://github.com/komiyamma/hidemaru_eval_bug/blob/main/Dll2/dllmain.cpp
(Dll2.dll)としてコンパイル
・.macソース
https://github.com/komiyamma/hidemaru_eval_bug/blob/main/Debug/DLL2.mac
■「.dllが解放される、解放されない、の確実な切り替えポイント
・https://github.com/komiyamma/hidemaru_eval_bug/blob/main/Dll2/dllmain.cpp
の67行目、
int success2 = EvalMacro(LR"RAW(#r = dllfuncw(#dll, "DoSomething2nd", mess
age(10));)RAW");
の状態で、DLL2.macを実行すると、いわゆる秀丸マクロの型エラー表示の後、
マクロは終了するが、dllは解放されないままとなる。
(秀丸が独自に呼び出しているデタッチ関数などはコールされるが、dllは解放され
ない)
一度秀丸を全て終了し、改めて
同67行目を
int success2 = EvalMacro(LR"RAW(#r = dllfuncw(#dll, "DoSomething2nd", mess
age("10"));)RAW");
と修正すると文法が正しくなる。
コンパイルしなおし、改めてDLl2.macを実行すると、
今度はdllは解放される。
この「差」はFreeLibraryを実行しているが失敗している、とかではなく、
マクロ停止系エラーの際に、単純にマクロ解放処理の一部の「実行もれ」があるよ
うにように思えます。
|
|