0

デバッグ時に ( で開始) 正常に動作する Win32 プログラム (デスクトップ アプリ) がF5ありますが、デバッグなしで実行すると、ウィンドウもタイトルも描画されません ( Ctrl + F5)。そんなことがあるものか ?私はVS2010を使用しています。

編集: リリース ビルドでは、コードはデバッグなしで正常に動作しますが、デバッガーでは動作しません。これは、デバッグ ビルドで発生することとは正反対です。

新しい編集:

これに何時間も取り組んだ後、問題が静的 std::auto_ptr オブジェクトの reset() メンバー関数による初期化に何らかの形で関連していることがわかりました。

上で言ったことを思い出してください。ウィンドウ タイトルはアプリ ウィンドウに表示されず、このタイトルは WM_CREATE メッセージ処理の最後に SetWindowText(hwnd, L"Any Title") で設定されます。次に、WM_CREATE 内でこの関数呼び出しをさかのぼって、ウィンドウのタイトルを表示できなかった場所を正確に確認しました。これは、以下の疑似コードのように、静的 std::auto_ptr オブジェクトの最初の初期化後に発生します。

class A{};

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
    static std::auto_ptr<A> a;
    switch ( message )
    {
        case WM_CREATE:
        {
            ...
            a.reset(new A);
            SetWindowText(hwnd, L"Any Title");
            ...
        }
        break;

        case WM_PAINT:

        ...

        break;

        case WM_DESTROY:

        PostQuitMessage(0);
        break;

        default:

        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

つまり、変数の初期化の前に SetWindowText() を呼び出すとa、ウィンドウが描画されるときにクライアント領域にテキストは表示されませんが、ウィンドウのタイトルは正しく表示されます。MessageBeep(-1)に を挿入したので、ウィンドウがペイントされていることがわかりますWM_PAINT。音が聞こえます。

WM_PAINT に出力されるものはすべてclass A、ヒープに割り当てられたオブジェクトから取得され、そのアドレスはオブジェクトにカプセル化されていることに言及するのも興味深いことstd::auto_ptrです。

もちろん、これはすべて、 を使用してコードを実行するときに発生しCtrl + F5ます。プログラムが起動すると、F5すべて正常に動作します。

新しい編集:

std::auto_ptr変数をunique_ptr無駄に変更しました。問題は続きます。

4

1 に答える 1

0

タイミングの問題である可能性があります(説明できない動作は、何らかの競合状態であることが多いです)。関連するイベント/オーバーライドにデバッグ トレースを追加して、何が起こっているかを確認します。

于 2012-06-04T06:17:45.793 に答える