VisualC++でSetTimerとBitmapを使っているソフトを作っているのですが、終了時に[fflush.c]でアクセス違反が発生します。どなたかわかる人教えてください。お願いします。|(__)|
編集 削除言い忘れました。MFCは使っていません。
編集 削除それだけでわかる人がいたら超能力者だと思います。
終了時に何か処理をしているなら、そのあたりを載せないと…。
すみません。説明不足でした。
終了時に行っていることは、
case WM_CLOSE:
KillTimer(hWnd, IDM_timer1);
if(hStageBitmap != NULL)
DeleteObject(hStageBitmap);
if(hBitmap1 != NULL)
DeleteObject(hBitmap1);
if(StageData.hMemDC != NULL)
DeleteDC(StageData.hMemDC);
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
・・・・間違えて送信してしまいました。
シャノンさん。返答ありがとうございます。
上の処理を行っています。
それぞれのハンドルには正常にハンドルが入っているんですが・・。
あと、そのアクセス違反は毎回ではなく、2,3回に一回起こるんです。ときには連続でも。
まだこれでも説明不足かもしれませんが、わかりましたら教えてください。
何でしょうねぇ…
終了時処理は、各変数の値が正しいというのなら、処理自体はおかしくないようですが。
そのエラーが出る fflush.c の行にブレークポイントをはって、関数呼び出し履歴をさかのぼって見ると何かわかるかもしれませんね。
すみません。自分はVCを始めたばかりなので・・・。
ブレークポイントの使い方はわかるのですが、どう張ればいいのでしょうか?
毎回アクセス違反が発生する行へブレークポイントを張って、ブレークポイントが発生したときにその履歴に表示されている関数を調べるということですか?
参考にエラー箇所を載せておきます。
[fflush.c] 234 〜 267 行
static int __cdecl flsall (
int flushflag
)
{
REG1 int i;
int count = 0;
int errcode = 0;
#ifdef _MT
_mlock(_IOB_SCAN_LOCK);
__try {
#endif /* _MT */
for ( i = 0 ; i < _nstream ; i++ ) {
//////////////////////////////////////ここでアクセス違反になります。///////////////
if ( (__piob[i] != NULL) && (inuse((FILE *)__piob[i])) ) {
/////////////////////////////////////////////////////////////////////////////////
#ifdef _MT
/*
* lock the stream. this is not done until testing
* the stream is in use to avoid unnecessarily creating
* a lock for every stream. the price is having to
* retest the stream after the lock has been asserted.
*/
_lock_str2(i, __piob[i]);
__try {
/*
* if the stream is STILL in use (it may have been
* closed before the lock was asserted), see about
* flushing it.
*/
if ( inuse((FILE *)__piob[i]) ) {
#endif /* _MT */
もしここにどのような数値が入っているかわかったら教えて下さい。
そのコードは MS が書いたものなので、おそらくバグはないでしょう。
各変数にどんな値が入るかは、実行時までわかりません。
そのアクセス違反になる行にブレークポイントを張って、実行時にそこまで行ったら、「呼び出し履歴」ウィンドウでも使って、それがどこから呼び出されているか見るといいんじゃないでしょうか。
KillTimer(hWnd, IDM_timer1);
の後にSleepを入れてみる。
hStageBitmapなどを呼んでいる場所(多分タイマーの処理の中だと思いますが)
でNULLかどうかチェックしてみるなど試してみてはいかがでしょうか?
タイマーの処理中にhStageBitmapを呼び出すところで終了処理が来て削除してしまって、
アクセスエラーになったと考えられるかも知れません。
的外れかもしれませんが、なんとなく思ったことです。
以上。