2009-06-23 11 views
1

私のアプリケーションと統合するために、C++ DLLと関連するヘッダーファイルが提供されています。まずは単純なWin32コンソールアプリケーションからDLLを呼び出そうとしています(Visual Studio 2008 Expressを使用しています)。C++ - 第三者DLLへのリンク - 断続的なアクセス違反

私は、DLLをプロジェクト設定の追加の依存関係として指定してリンクしました。

インターフェイス(つまり、エクスポートされた関数のみ)は、実際に呼び出す必要のあるクラスのインスタンスへのポインタを返します。私は正常にこれを呼び出し、ポインタを取得し、私が必要とする最初の関数( "init"関数)を呼び出すことができます。

私が必要とする処理を実際に実行する関数を呼び出すとき、私は断続的に「0xC0000005:アクセス違反の読み込み中....」というエラーが発生しています。つまり、私はプログラムを実行します。正常に動作し、終了します。何も変更せずに、すべてのパラメータがハードコードされていて、再度実行しようとします。

私は一貫して問題を再現することはできませんが、DLLが正しくアンロードされていないと思われるようになっています。エラーを一度受け取り、DLLを削除しようとしました。それが使用されていたWindows。それは、別の機会に私はエラーを取得した後にDLLを削除することができた、それをコピーして、次の実行時にエラーが発生したと言いました。

私の.exeが終了したらDLLを正しくアンロードする必要がありますか? DLLを暗黙的にロードするのではなく、明示的にロード/アンロードする方が良いでしょうか?

他のヘルプやアドバイスは非常に高く評価されています。

+0

これは非常に一般的な質問です。コードや文書を投稿することはできますか? – Tim

+1

これはデバッガで発生しますか?あるいは、それが起こったときに、デバッガを接続してコールスタックを調べるのはなぜですか? – MSN

答えて

1

アンロードされたDLLとは何の関係もありません。同じDLLを使用する異なるプロセスは、どの状態も共有しません。また、プロセスが終了すると、DLLはアンロードされます。おそらく上品ではないかもしれませんが、アンロードされます。

私は断続的な失敗の2つの理由が考えられます。

ほとんどの場合、DLLには競合状態があります。これは、DLLがキャッシュされている場合に公開される可能性があり、タイミングが変更される可能性があります。それは最初の試合が失敗しなかった理由を説明するだろうが、その後の試合は失敗した。

私は、DLLがいくつかのファイルのロックを解除していない可能性も考えています。このDLLによってアクセスされていることがわかっているファイルがある場合は、プロセスが終了した後にそのファイルがロックされているかどうかを確認してみてください。

また、デバッガでこれを取得します。ビジュアルスタジオで最初の例外をオンにし、AVが起こっているコールスタックを見て、ここに投稿してください。

+0

コールスタックは、 "my.exe!wmain(int argc = 1、wchar_t * * argv = 0x00981ad0)Line 96 + 0xed bytes C++"と表示します。コールスタックは、私が実際にソースを持っていないコードを呼び出していることを考えると、実際には私にあまり与えてくれないだろうと思いますか? – William

1

DLLによってエクスポートされるクラスにはどのようなタイプが関係していますか?クラスでSTLを使用する場合、Visual Studioでこの種の問題が発生することがよくありました。テンプレートを使用すると、このような問題が発生する可能性があります。

1

設定プロパティの「C/C++」の「ランタイムライブラリ」の設定は何ですか?
おそらく/ MD(または/ MDd)を試してみてください。
http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx

+0

ありがとうございます。ちょうど私の仕事のラップトップを見てみましょう。それは/ MTdでした。私は/ MDに変更して再構築しました。その後、プログラムを3回連続して実行し、問題が解決したと考えました。その後、4回目に再びアクセス違反が発生しました。 – William

関連する問題