- ベストアンサー
MSACCESSで0xc0000005でエラー
- MSACCESSで0xc0000005でエラーが発生し、処理Bが固まる問題が発生しています。
- 問題のエラーコードは0xc0000005で、acedao.dllがエラーとなっています。
- 再現が難しく進展が困難な状況ですが、解決策を探しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
同時アクセスの問題を軽減させたいなら、以下のように改良してみましょう。 A側 ・存在チェックに使用するキーファイルが存在していない場合のみ、データファイルを作る。 キーファイルの存在チェックは、ファイルのオープン等を使わず、FindFirstなどのフォルダ内の特定ファイルを検索するAPIを使う。 ・データファイルを作ったら、データファイルを閉じて他プロセスが自由に使えるようにしてから、キーファイルを生成する。 ・キーファイルが存在している間は「B側がデータファイルに触っている」として、一切、データファイルに触らない。 逆に言えば「キーファイルが存在してない状態なら、データファイルを自由自在にしてよい」と言う事。 要は「キーファイルの生成」は「データファイルのアクセス権の放棄」として機能する。 B側 ・存在チェックに使用するキーファイルが存在している場合のみ、データファイルをオープンする。 キーファイルの存在チェックは、ファイルのオープン等を使わず、FindFirstなどのフォルダ内の特定ファイルを検索するAPIを使う。 ・データファイルを処理し終わるまで、キーファイルは削除しない。 ・データファイルを処理し終わったら、ファイルを閉じて、データファイル、キーファイルの順番でファイル削除する。 キーファイルを削除する際は、データファイルがきちんと削除出来ているかを確認してから削除する。 ・キーファイルが存在していない間は「A側がデータファイルに書き込み中かもしれない」として、一切、データファイルに触らない。 逆に言えば「キーファイルが存在している状態なら、データファイルを自由自在にしてよい」と言う事。 要は「キーファイルの削除」は「データファイルのアクセス権の放棄」として機能する。 注意 FindFirst等のフォルダ内検索APIを使う場合は、APIを使用終了して内部メモリを開放する、終了用APIを呼び出すのと、オブジェクトの開放を忘れずに(メモリリークの原因になる) その他 この方式なら「キーファイルが生成された時間」を元に「特定の時間、A、Bのどちらかの処理が停止してデットロックしている」のが判るので、デットロック対策用のウォッチドックプロセスを作る事が出来ます。 ウォッチドックがA、Bのプロセスの停止を関知した場合、ウォッチドックプロセスでデータファイルとキーファイルを削除すると良いでしょう。 そうすると、故意に手動でA、Bのプロセスを停止させたり強制終了したとしても、自動的にデータファイルとキーファイルが削除され、フォルダに残骸が残りません。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
0xc0000005は、メモリアクセス違反です。 考えられる原因は ・ファイルの作成と、ファイルの存在確認が同時に起こった ・Accessのmdbファイルを定期的に最適化していないので、mdbに正常に書き込めなくなった ・Access自体で起きているメモリリーク(Accessの不具合) などです。 再現は「事実上不可能」です。
補足
早速の回答ありがとうございます。 この現象で再現性があるとしたら ・ファイルの作成と、ファイルの存在確認が同時に起こった ですかね。 1分起きにファイル存在チェックをしているのでAccessの ファイル作成と存在チェックとを同時にいくらやっても 現象は発生しません。
お礼
回答、ありがとうございます。 では、この方法も含めてやってみたいと思います。 もうひとつたけ質問なのですが、考えたら同一の現象が 別システムで使用しているAccessにも起りそうなので VS2005でEXEとAccessと両方をActiveXdllみたいな形で 考えたいなと思っているのですが、何か良い方法は ありますでしょうか? よろしくお願いします。