| |
こちらではお久しぶりです。
杉浦 まさき です。
え〜と、先日β公開した BREGEXP DLL の秀丸マクロ用ラッパー DLLを
マクロで使用して、マクロ内で freedll せずにマクロを終了させ、
その秀丸ウィンドウを閉じたときに保護違反で落ちてしまいました。
#Ver.3.14β5で確認
デバッガで動作を追ってみると、どうも以下のような事態になって
いるようです(?)。
[マクロ中]
loaddll "BRE_Wrap.dll"; // LoadLibrary("BRE_Wrap.dll");
[BRE_Wrap.dll 内]
DllMain() 内の DLL_PROCESS_ATTACH
hModule = LoadLibrary("BREGEXP.DLL");
DllMain() 内の DLL_PROCESS_DETACH
// BREGEXP.DLL が返したメモリを開放←ここで落ちる
FreeLibrary(hModule);
この時点でDLLがロードされた順番がOSによって記憶されており、
秀丸終了時に明示的に FreeLibrary() されていない DLL は
OSによって「ロードされた順序とは逆の順序で」アンロードされる。
#↑これがイマイチ確信がないです(^^;。
で、アンロードは BREGEXP.DLL → BRE_Wrap.dll の順に実行され、
BRE_Wrap.dll の FreeLibrary() のところでアクセス違反で落ちる…
と、多分(^^;こういうことじゃないかと思っています。
#マクロ中で freedll すれば落ちないので。
この予想が正しいかどうかは??ですが、もし秀丸ウィンドウの
クローズのときにマクロでロードした DLL を明示的にアンロード
していない場合は、面倒でも FreeLibrary() でアンロードして
もらえると嬉しいです。
予想が外れていたらすみませんm(_ _)m。
#この場合何で落ちるのかが謎ですが…。
BRE_Wrap.DLL の URL:http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/bre_
wrapper/bre_wrap_000b.lzh
|
|