DLL の解放タイミングNo.03401
Iranoan さん 03/11/26 17:17
 
 秀丸担当さん、皆さん今日は、Iranoan です。
 loaddll でロードした DLL および、DLL の作成法について質問です。
loaddll $dll;
のあと freedll をしないでウィンドウを閉じたとき、どういう動きをするの
でしょうか?
(1) $dll はどうなるのでしょう?
    ちゃんと解放されるのか、それともメモリに残ったまま?
(2) DLL 内部で取得したデータの扱いは?
    1.仮に $dll 自体は解放されるとして、
      BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
        LPVOID pParam
      ){
                  :
                  :
        switch (dwReason) {
        case DLL_PROCESS_ATTACH:
                  :
                  :
        case DLL_PROCESS_DETACH:
                  :
                  :
      }
      というソースで、freedll したときと同様、DLL_PROCESS_DETACH の部
      分の処理は実行されるのか?
    2.$dll 自体が解放されないなら、どうすれば確実にメモリーを解放する
      DLL にできるのか?

 デバッガが使えないので、MessageBox 関数を使って試した限りでは、
freedll と実行したときと同じ処理をしていると思うのですが、念の為お聞き
します。

[ ]
RE:03401 DLL の解放タイミングNo.03403
秀まるお さん 03/11/26 17:42
 
 秀丸に限らずですが、プロセスが終了すると、そのプロセスがロードしてた
DLLも全部解放されます。

 複数プロセスが同時に1つのDLLをロードしてる場合は、ロードしてる複数プ
ロセス全部が終了するまでDLLは解放されません。

 特に、アプリケーションソフトがFreeLibrary()を呼ばなくてもそういう動作
となります。

---------------------------
 秀丸の場合、「秀丸の瞬間起動」がONになっていると、見た目的に終了してて
も、実は裏にプロセスが隠れて存在しつづけます。その結果、DLLが解放されな
いことがあります。それだけ注意が必要です。

 他に特殊な例としては、SetWindowsHook/SetWindowsHookExでグローバルなフ
ックをかけていると、DLLが解放されないことがあります。

[ ]
RE:03403 DLL の解放タイミングNo.03404
Iranoan さん 03/11/26 18:01
 
 秀まるおさん今日は、Iranoan です。
>  秀丸に限らずですが、プロセスが終了すると、そのプロセスがロードしてた
> DLLも全部解放されます。
 具体例まで示した詳細な説明をして頂き、有り難うございました。

[ ]