Visual studio 2010 Windows MessageBox导致错误的OpenGL版本正常工作 在VisualStudioC++ 2010开发的OpenGL Win32程序中,调试版本正确运行,不管怎样,只有在我的代码的某个范围内插入MeaSeaBox()诊断消息,发布版本才起作用。当然这是一个问题,因为现在我无法使用MessageBox()调试我的发布版本,这是我通常所做的。此外,如果我将MessageBox()放在代码的另一部分(在有问题的显示循环内),它不会使程序正常工作,而是将光标插入沙漏/非沙漏中,并且它不会显示MessageBox(),几乎就好像MessageBox()代码在每个显示帧中都被调用,但没有做任何正确的事情一样

Visual studio 2010 Windows MessageBox导致错误的OpenGL版本正常工作 在VisualStudioC++ 2010开发的OpenGL Win32程序中,调试版本正确运行,不管怎样,只有在我的代码的某个范围内插入MeaSeaBox()诊断消息,发布版本才起作用。当然这是一个问题,因为现在我无法使用MessageBox()调试我的发布版本,这是我通常所做的。此外,如果我将MessageBox()放在代码的另一部分(在有问题的显示循环内),它不会使程序正常工作,而是将光标插入沙漏/非沙漏中,并且它不会显示MessageBox(),几乎就好像MessageBox()代码在每个显示帧中都被调用,但没有做任何正确的事情一样,visual-studio-2010,winapi,visual-c++,opengl,Visual Studio 2010,Winapi,Visual C++,Opengl,如果MessageBox()在某些地方神奇地修复了该漏洞,则可以深入了解导致该漏洞的原因 MessageBox()内置了一个windows消息泵循环,用于维护窗口消息 在应用程序中的某个地方,在设计中处于非常低的级别,您需要一个windows消息循环来为承载openGL内容的窗口提供消息服务。这应该在创建窗口的线程中运行。当从不同的线程调用MessageBox()时,您在其他地方看到的不良影响很容易由争用副作用引起 下面是MSDN窗口消息操作的介绍 非常简单地说(通过来自的代码示例),您需要一

如果MessageBox()在某些地方神奇地修复了该漏洞,则可以深入了解导致该漏洞的原因

MessageBox()
内置了一个windows消息泵循环,用于维护窗口消息

在应用程序中的某个地方,在设计中处于非常低的级别,您需要一个windows消息循环来为承载openGL内容的窗口提供消息服务。这应该在创建窗口的线程中运行。当从不同的线程调用
MessageBox()
时,您在其他地方看到的不良影响很容易由争用副作用引起

下面是MSDN窗口消息操作的介绍

非常简单地说(通过来自的代码示例),您需要一个类似于以下内容的固定循环:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
根据您处理更新窗口的方式,如果您使用的是绘制消息(
WM_paint
),则需要确保尽快发送这些消息,或者如果您直接绘制到设备DC,则可能需要完全抑制这些消息。我之所以提到这一点,是因为一旦消息循环正确设置,您可能会发现其他错误


知道调试版本有什么不同吗?运行调试或发布时不应该有任何明显的差异;我只能根据我们所知道的推断,导致症状消失的原因是什么。我们还可以推测,还有一个被忽略的额外细节,例如debug ASSERT()或其他特定于调试的代码,这些代码也隐式地导致消息被抽取。我将要求Op发布堆栈跟踪;因为这些可能是最有用的信息,可以帮助诊断此问题,而无需深入检查代码。根据pezcode在我的回答中的说明,如果您可以从需要插入
MessageBox()
的位置设置的断点发布堆栈跟踪,这将有所帮助,无论是从调试版本还是发布版本。这将有助于为我们描绘一幅更清晰的画面,而不需要您发布大量代码。如果您希望获得帮助,请提供更多详细信息。