デバッグ時に ( で開始) 正常に動作する 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
無駄に変更しました。問題は続きます。