ウィンドウ終了時についてのアクセス違反


origi  2004-11-13 08:00:52  No: 55132  IP: [192.*.*.*]

VisualC++でSetTimerとBitmapを使っているソフトを作っているのですが、終了時に[fflush.c]でアクセス違反が発生します。どなたかわかる人教えてください。お願いします。|(__)|

編集    削除
origi  2004-11-13 08:03:20  No: 55133  IP: [192.*.*.*]

言い忘れました。MFCは使っていません。

編集    削除
シャノン  2004-11-13 08:58:51  No: 55134  IP: [192.*.*.*]

それだけでわかる人がいたら超能力者だと思います。
終了時に何か処理をしているなら、そのあたりを載せないと…。

編集    削除
origi  2004-11-14 00:02:29  No: 55135  IP: [192.*.*.*]

すみません。説明不足でした。
終了時に行っていることは、

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);

編集    削除
origi  2004-11-14 00:05:32  No: 55136  IP: [192.*.*.*]

・・・・間違えて送信してしまいました。

シャノンさん。返答ありがとうございます。

上の処理を行っています。
それぞれのハンドルには正常にハンドルが入っているんですが・・。
あと、そのアクセス違反は毎回ではなく、2,3回に一回起こるんです。ときには連続でも。
まだこれでも説明不足かもしれませんが、わかりましたら教えてください。

編集    削除
シャノン  2004-11-14 04:12:37  No: 55137  IP: [192.*.*.*]

何でしょうねぇ…
終了時処理は、各変数の値が正しいというのなら、処理自体はおかしくないようですが。
そのエラーが出る fflush.c の行にブレークポイントをはって、関数呼び出し履歴をさかのぼって見ると何かわかるかもしれませんね。

編集    削除
origi  2004-11-14 06:09:47  No: 55138  IP: [192.*.*.*]

すみません。自分はVCを始めたばかりなので・・・。
ブレークポイントの使い方はわかるのですが、どう張ればいいのでしょうか?
毎回アクセス違反が発生する行へブレークポイントを張って、ブレークポイントが発生したときにその履歴に表示されている関数を調べるということですか?

編集    削除
origi  2004-11-14 06:33:34  No: 55139  IP: [192.*.*.*]

参考にエラー箇所を載せておきます。

[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 */

もしここにどのような数値が入っているかわかったら教えて下さい。

編集    削除
シャノン  2004-11-15 18:58:25  No: 55140  IP: [192.*.*.*]

そのコードは MS が書いたものなので、おそらくバグはないでしょう。
各変数にどんな値が入るかは、実行時までわかりません。

そのアクセス違反になる行にブレークポイントを張って、実行時にそこまで行ったら、「呼び出し履歴」ウィンドウでも使って、それがどこから呼び出されているか見るといいんじゃないでしょうか。

編集    削除
槙沢  2004-11-16 17:01:27  No: 55141  IP: [192.*.*.*]

KillTimer(hWnd, IDM_timer1);
の後にSleepを入れてみる。

hStageBitmapなどを呼んでいる場所(多分タイマーの処理の中だと思いますが)
でNULLかどうかチェックしてみるなど試してみてはいかがでしょうか?

タイマーの処理中にhStageBitmapを呼び出すところで終了処理が来て削除してしまって、
アクセスエラーになったと考えられるかも知れません。

的外れかもしれませんが、なんとなく思ったことです。
以上。

編集    削除