私はWin7とVS 2010に取り組んでいます。
私のアプリケーションは LoadLibrary を呼び出して A.dll をロードします。LoadLibrary は NULL を返し、エラー コードは私の予想どおり 126 です。
その後、アプリケーションを放っておくと、数分後にクラッシュします。
Windows イベント ビューアに次のエラー メッセージが表示されます。
例外コード: 0xc0000005
障害のあるアプリケーション パス: MyApplication.exe
障害が発生しているモジュール パス: A.dll
どうしたの?!私のアプリケーションは LoadLibrary を 1 回だけ呼び出すと確信しています。アンロードされた Dll でどのようにエラーが発生する可能性がありますか?
ありがとう〜
結果:
すべての助けをありがとう。
最後に、私はクラッシュの理由を見つけました。
A.dll にメッセージ ループを含むスレッドがありました。A.dll をアンロードする前に、このスレッドを終了させるのを忘れていました。GetMessage() でブロックされたため、アプリケーションはすぐにはクラッシュしませんでした。GetMessage() から戻ると、クラッシュしました。
A.dll :
void ThreadFunc (void *) {
while (true) Sleep(10000); // message loop
return ;
}
extern "C" {
__declspec(dllexport) int init() {
_beginthread(ThreadFunc, 0, NULL);
return 0;
}
}
応用 :
typedef int (*FUNC)();
HMODULE hMod = LoadLibrary(TEXT("A.dll"));
FUNC init = (FUNC) GetProcAddress(hMod, "init");
init();
Sleep(1000); // wait for thread to sleep
BOOL freeRet = FreeLibrary(hMod);