setdlldetachfunc文(Ver9.35対応版)
目次−
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以降)
5 現在のファイルを閉じたとき(
keepdll #dll,3;のとき)(V9.32以降)
例:
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;
}