English help on website



setdlldetachfunc文(Ver9.57対応版)
目次DLL呼び出し機能− setdlldetachfunc文
setdlldetachfunc文は、DLLが解放されるタイミングで呼び出される、DLL側の関数(C/C++の関数)を設定します。
setdlldetachfunc "FuncName";
setdlldetachfunc #dll, "FuncName";
パラメータ1(数値型または文字列型)
文字列の場合は、loaddll文による、プロセスに1つだけのDLLに対して、関数名を指定します。
数値の場合はloaddll関数による、複数のDLLを扱う場合の識別値を指定します。

パラメータ2(文字列型、省略可能)
パラメータ1で数値によるDLL指定をしている場合、ここで関数名を指定します。

結果コード
成功時はresultは0以外になります。
失敗時はresultは0になります。

JavaScript
JavaScriptでは使えません。
DllFuncManagerオブジェクトに、同名のメソッドがあります。


DLLが解放されるタイミングで呼び出される関数は、マクロが終了した後でも、秀丸エディタの終了時などにDLLが解放されるタイミングがあれば呼び出されます。

この文を実行せず、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;
}