ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ss1

ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

#1

投稿記事 by ss1 » 9年前

HANDLE LoadLibrary(lpszLibFile)関数でDLLをロードしてその後アプリの終了に伴い
FreeLibrary(hLibModule) はTRUEを返して成功するのですが
その状態でDeleteFile(***.DLL)のようにしても削除はできないのです
FreeLibrary(hLibModule)を実行したプログラム内ではどうして削除はできないのでしょうか?

アバター
びす
記事: 31
登録日時: 14年前

Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

#2

投稿記事 by びす » 9年前

下のコードを動かしたところ、正常に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;
}

アバター
びす
記事: 31
登録日時: 14年前

Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

#3

投稿記事 by びす » 9年前

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;
}

ss1

Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

#4

投稿記事 by ss1 » 9年前

びす さん アドバイスありがとうございます
やってみると確かに何も使用しなければ(単にロードして解放するだけ)削除できますね
ということはまだどこかで使用中ということなのでしょうか?
プログラムのWM_DESTROY:のメッセージで処理してるのですが
一度ロードして使用されたものは、スレッド等クローズしてるつもりでもアクティブになっているのでしょうか?
強制的に完全に切り離すことはできないでしょうか?
それとも使用すると自分のプログラムと一緒になるためそれを分離できなくなるのでしょうか?
これを調べる方法はないですよね?
FreeLibraryで成功ですから切り離しが出来ていると思っていても、そうではない?
自分のプログラムを終了すると削除できるようになるのです

ss1

Re: ロードしたDLLを開放後に削除可能にするにはどうしたら良いのですか?

#5

投稿記事 by ss1 » 9年前

びす さん どうもすみません
私のとんでもない誤りでした、ご迷惑おかけしました、削除するPATHが間違っていました、はずかしい
アドバイスありがとうございました。解決です

閉鎖

“C言語何でも質問掲示板” へ戻る