DLL解放後にアクセス違反が発生します。

[戻る]
平井 2002/09/13(金) 14:10:36
開発環境 VC6.0 Windows2000SP2 MFC

DLLをLodaLibrary()でロードして、GetProcAddress()で関数ポインタを取得し、
関数を使用した後でFreeLibrary()すると次のエラーがでます。
----------------------------------------------------------------------
例外処理(初回)は ***.exe にあります。: 0xC0000005: Access Violation。
----------------------------------------------------------------------

Access Violationの発生するタイミングは毎回微妙に異なります。

DLLから取得して実行した関数はスレッドを生成しますが、FreeLibrary()を
呼び出す前には必ず終了させています。

LodaLibrary()とFreeLibrary()の代わりにAfxLoadLibrary()と
AfxFreeLibrary()を使ってみましたが何も変わりませんでした。

何か注意すべきこと、調べるべきことがありましたらご教授下さい。

2002/09/13(金) 15:05:21
>DLLをLodaLibrary()でロードして、GetProcAddress()で関数ポインタを取得し、
>関数を使用した後でFreeLibrary()すると次のエラーがでます。
コードについての説明なのか、エラーが起きる条件なのかがはっきり
しません。そこで、以下の質問にお答え願えませんか

FreeLibrary しなければ例外は発生しないのですか?
函数を呼ばなければ例外は出ませんか?

平井 2002/09/13(金) 17:24:20
> FreeLibrary しなければ例外は発生しないのですか?

発生しません。FreeLibrary後しばらくしてから(実行時間では一瞬)例外が発生します。
デバッグしているのですがどこで例外が発生しているのか追いきれないのです。

> 函数を呼ばなければ例外は出ませんか?

次のような状況です。

LoadLibrary() → DLL関数使用  → FreeLibrary()  //例外発生
LoadLibrary() → DLL関数未使用 → FreeLibrary()  //例外発生せず
LoadLibrary() → DLL関数使用             //例外発生せず

可能性として考えているのは、
・DLLから取得した関数Aの実行によりスレッド生成
・DLLから取得した関数Bの実行によりスレッド終了(のつもりが実は別スレッドが生きてい
る)
・LoadLibrary()により解放(→実行中のコードを解放してしまった。)
という流れです。

なお、XとYという同じ関数群(同じ関数名)を持つ2つのDLLが存在し、
例外はYのみで発生致します。

平井 2002/11/12(火) 10:50:34
[[解決]]
結局問題は解決しませんでしたが、DLLをアプリケーション終了まで
解放しないことで対処することにしました。
原因を少しでも考えてくださった皆様ありがとうございました。

古いスレッドには追加発言できません。