English help on website



setdlldetachfunc文(Ver9.24対応版)
目次DLL呼び出し機能− setdlldetachfunc文
DLLが解放されるタイミングで呼び出される関数を設定します。
マクロが終了した後でも、秀丸エディタの終了時などにDLLが解放されるタイミングがあれば呼び出されます。

loaddll文で単一のDLLを扱う場合:
第1パラメータに文字列を指定すると、loaddll文で読み込まれたDLLに対応するDLLに対して設定されます。
例:
setdlldetachfunc "MyDllDetachFunc";

loaddll関数で複数のDLLを扱う場合:
第1パラメータに数値を指定すると、loaddll関数で読み込まれたDLLに対応するDLLに対して設定されます。
第2パラメータには関数名を指定します。
例:
setdlldetachfunc #dll, "MyDllDetachFunc";

この文を実行せず、DLL側に"DllDetachFunc_After_Hm866"という関数がエクスポートされていれば、
setdlldetachfunc "DllDetachFunc_After_Hm866";
または setdlldetachfunc #dll, "DllDetachFunc_After_Hm866";
をしているのと同じになります。

DLL側の関数はdllfuncと同じように定義します。

V8.77β6以降では、どのような理由で解放されたかを表す情報が第1パラメータに数値が入って呼ばれます。
第1パラメータの値の意味は以下の通りです。
1 freedllで解放
2 loaddll(文のほう)で既に読み込まれていたものが解放
3 プロセス終了時
4 マクロ終了時(keepdll #dll,0;のとき)(V8.98以降)

例:
extern "C" __declspec( dllexport )
INT_PTR MyDllDetachFunc( INT_PTR n ) {
   if( n == 1 ) {
     //freedll
   } else if( n == 2 ) {
     //loaddll文による入れ替え
   } else if( n == 3 ) {
     //プロセス終了時
   } else {
     //V8.77β6未満か未知の値
   }
    return 0;
}