ページ 1 / 1
ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?
Posted: 2016年3月17日(木) 09:55
by ss1
HANDLE LoadLibrary(lpszLibFile)関数でDLLをロードしてその後アプリの終了に伴い
FreeLibrary(hLibModule) はTRUEを返して成功するのですが
その状態でDeleteFile(***.DLL)のようにしても削除はできないのです
FreeLibrary(hLibModule)を実行したプログラム内ではどうして削除はできないのでしょうか?
Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?
Posted: 2016年3月17日(木) 12:12
by びす
下のコードを動かしたところ、正常にDLLが削除されました。
ss1さんのコードの中に間違った点があったり、お行儀の悪いDLLだったり、などに起因して、DLLが正しく開放されていないのではないでしょうか。
コード:
/* ロードされるDLL */
#include <Windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved){
return TRUE;
}
/* ロードするEXE */
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int main(int argc, char *argv[]){
TCHAR lpszLibFile[] = _T("ロードされるDLL.dll");
HMODULE hLibModule = LoadLibrary(lpszLibFile);
printf("%x\n", DWORD(hLibModule));
printf("%x\n", FreeLibrary(hLibModule));
printf("%x\n", DeleteFile(lpszLibFile));
return 0;
}
Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?
Posted: 2016年3月17日(木) 13:02
by びす
LoadLibrary()を2回以上呼んでいたり、他の処理がそのDLLをロードしFreeLibrary()していない場合、DLLは実際には開放されていないため、削除に失敗します。
コード:
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int main(int argc, char *argv[]) {
TCHAR lpszLibFile[] = _T("ロードされるDLL.dll");
HMODULE hLibModule = LoadLibrary(lpszLibFile);
LoadLibrary(lpszLibFile); // 2回目
printf("%x\n", DWORD(hLibModule));
printf("%x\n", FreeLibrary(hLibModule));
printf("%x\n", DeleteFile(lpszLibFile)); // 失敗する
return 0;
}
Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?
Posted: 2016年3月17日(木) 14:16
by ss1
びす さん アドバイスありがとうございます
やってみると確かに何も使用しなければ(単にロードして解放するだけ)削除できますね
ということはまだどこかで使用中ということなのでしょうか?
プログラムのWM_DESTROY:のメッセージで処理してるのですが
一度ロードして使用されたものは、スレッド等クローズしてるつもりでもアクティブになっているのでしょうか?
強制的に完全に切り離すことはできないでしょうか?
それとも使用すると自分のプログラムと一緒になるためそれを分離できなくなるのでしょうか?
これを調べる方法はないですよね?
FreeLibraryで成功ですから切り離しが出来ていると思っていても、そうではない?
自分のプログラムを終了すると削除できるようになるのです
Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?
Posted: 2016年3月17日(木) 14:21
by ss1
びす さん どうもすみません
私のとんでもない誤りでした、ご迷惑おかけしました、削除するPATHが間違っていました、はずかしい
アドバイスありがとうございました。解決です