F5我有一个Win32程序(桌面应用程序Ctrl + F5),在调试(由 这怎么可能?我正在使用 VS 2010。
编辑:在 Release 构建中,代码可以在没有调试的情况下正常工作,但在调试器中却不行,这与 Debug 构建中发生的情况完全相反。
新编辑:
经过几个小时的研究,我发现问题与使用其 reset() 成员函数初始化静态 std::auto_ptr 对象有关。
记住我上面所说的,窗口标题不会显示在应用程序窗口上,并且这个标题是在 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)
in WM_PAINT
,我可以听到声音。
值得一提的是,WM_PAINT 中打印的所有内容都来自class A
堆上分配的对象,其地址封装在std::auto_ptr
对象中。
当然,这一切都是在使用Ctrl + F5. 当程序启动时F5一切正常。
新编辑:
我将std::auto_ptr
变量更改unique_ptr
为无济于事。问题还在继续。