我创建了一个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 );
在我的两个朋友的电脑上,当显示窗口时,这会崩溃。如果我删除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函数指针。
答案 0 :(得分:0)
必须在你的wndproc中。也许在对象创建和它的使用之间存在同步问题。
答案 1 :(得分:0)
由于您在此处发布的代码没有任何可以明确导致崩溃的代码,并且因为它只在实际显示窗口时发生,所以它看起来像是在draw()方法中。
最好的解决方案是构建应用程序的调试版本,并要求您的朋友在崩溃时使用任务管理器创建转储文件。您可以在Visual Studio中打开它,并查看导致崩溃的代码中的确切行。