1

Windows アプリケーションを作成しました。この問題は特定のコンピューターでのみ発生することに注意してください (私の環境では正常に動作します)。次のようにウィンドウを作成します。

RECT wr = {0, 0, rOp->resX, rOp->resY};
AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
WNDCLASS wc;
wc.style         = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc   = WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hAppInst;
wc.hIcon         = NULL;
wc.hCursor       = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName  = NULL;
wc.lpszClassName = L"App";
if (!RegisterClass(&wc))
{
    return false;
}
hAppWnd = CreateWindow( L"App", lpWindowName, WS_VISIBLE | WS_OVERLAPPED, 0, 0, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hAppInst, NULL );

2 人の友人の PC では、ウィンドウが表示されるとクラッシュします。WS_VISIBLE を削除すると、アプリケーションは ShowWindow が呼び出されるまで正常に動作し続けますが、そのときにクラッシュします。私の友人は、クラッシュする直前に白いウィンドウが表示されていると報告しているため、ウィンドウが表示されているように見えます。

なぜこれが起こっているのかについて誰かが理論を持っていますか?

編集: WndProc は次のとおりです。

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_PAINT:
        reng->draw();
        return 0;
    case WM_ERASEBKGND:
        return 1;
    default:
        return reng->DefProc(hWnd, Msg, wParam, lParam);
    }
}

DefProc は、これへの関数ポインターです。

LRESULT CALLBACK DefProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case GM_NEWGAME:
        newGame();
        return 0;
    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
}

(GM_NEWGAME はユーザー定義メッセージです)

DefProc 関数ポインターは、ウィンドウが作成される前に常に設定されます。

4

2 に答える 2

0

ここに投稿したコードには明示的にクラッシュを引き起こす可能性のあるものはなく、ウィンドウが実際に表示されたときにのみ発生するため、バグはdraw()メソッド内にあるように見えます。

最善の解決策は、アプリケーションのデバッグバージョンを作成し、クラッシュしたときにタスクマネージャーでダンプファイルを作成するように友人に依頼することです。Visual Studioで開いて、クラッシュの原因となったコードの正確な行を確認できます。

于 2012-06-24T23:27:55.957 に答える
0

wndproc にある必要があります。オブジェクトの作成とそこでの使用の間に同期の問題がある可能性があります。

于 2012-06-23T15:44:12.613 に答える