1

私は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);
4

0 に答える 0