プロセス終了時に実行するメソッドの指定

概要

hm.NETでは比較的複雑な「常駐型」のプログラムが組まれることも想定されています。
こういったプログラムで必要となるのが、

ユーザーのタイミングで秀丸がクローズされた時、後片付けの処理を実行する

というものです。

秀丸SetDetachMethod

  • C#側のソース

    返り値がIntPtrの関数(メソッド)を適当に定義します。
    引数もIntPtrのメソッドを定義します。
    (引数に関しては引数なしでも大丈夫です)

    Visual Studio で作成。HmTestClass03.dllとしてコンパイルのこと
    using System;
    
    namespace HmTestClass03
    {
        public class Class3
        {
            public static IntPtr OnDetachMethod(IntPtr reason)
            {
                int r = (int)reason;
                System.Diagnostics.Trace.WriteLine("OnDetachMethod実行 理由:" + r.ToString());
    
                return (IntPtr)1;
            }
    
        }
    }
    
  • reasonの値と理由

    reason:0

    秀丸エディタ v8.66未満

    reason:1

    freedll #HMNET などこの#DLLを手動でfreedllしようとした。

    reason:2

    loaddll関数ではなく、loaddll文を利用しており、新たなloaddll文が呼ばれることで、解放されようしている。
    loaddll文はそもそもhm.NETでは使うべきではない。

    reason:3

    プロセスが終了した(タブが閉じたか秀丸自体が閉じた)

    reason:4

    keepdll #HMNET, 0 が記載されている場合に発生する。
    マクロエラーによりdllが強制的に終了する際にこの4となる。

    reason:5

    keepdll #HMNET, 3を指定している時にのみ発生する。 ファイルを閉じて「無題」になる等、「プロセスが残った」状態でファイルが切り替わると呼び出される

  • 秀丸マクロ側のソース

    test01.macなどと適当に名前を付ける
    #HMNET = loaddll( hidemarudir + @"\hm.NET.dll" );
    
    #r = dllfuncw( #HMNET, "SetDetachMethod", currentmacrodirectory + @"\HmTestClass03.dll", "HmTestClass03.Class3", "OnDetachMethod" );
    

    秀丸を閉じることで、該当の秀丸プロセスが終了します。
    (タブモードであれば、タブそのものを閉じてタブを減らす行為をする)

    この時、秀丸が完全に終了する直前に OnDetachMethod が実行される、ということになります。

SetDetachMethodの利用は、常駐型モジュールやフォーム表示のモジュールでは必須

  • 実行した後、常駐し続けて何かを監視するようなプログラム
  • フォームのようなGUIを表示しておいて、秀丸の編集領域と情報を相互にやりとりし続けるようなプログラム

を組む場合には、この「SetDetachMethod」を利用した「後片付けをするメソッドの指定」は必須なものとなるでしょう。