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 );

在我的两个朋友的 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

必须在您的 wndproc 中。也许在对象创建和其中的使用之间存在同步问题。

于 2012-06-23T15:44:12.613 回答
0

由于您在此处发布的代码没有任何内容可以显式导致崩溃,并且仅在实际显示窗口时才会发生,因此看起来该错误位于 draw() 方法中。

最好的解决方案是构建应用程序的调试版本,并要求您的朋友在崩溃时使用任务管理器创建转储文件。他们可以在 Visual Studio 中打开它并查看代码中导致崩溃的确切行。

于 2012-06-24T23:27:55.957 回答