3

我有一个问题,我无法找到相关信息。以下代码导致了问题(为简洁起见,我省略了很多代码,但正如我将解释的,这段代码似乎工作正常):

mHDC = GetDC(mHWnd);
int format = ChoosePixelFormat(mHDC, &pixelFormat);
SetPixelFormat(mHDC, format, &pixelFormat);
mHGLRC = wglCreateContext(mHDC);
wglMakeCurrent(mHDC, mHGLRC);

mHWnd是通过获得CreateWindow()

const HINSTANCE hInstance(static_cast<HINSTANCE>(::GetModuleHandle(NULL)));

mHWnd = CreateWindow(wndClass.lpszClassName, L"Test Application", style, CW_USEDEFAULT, CW_USEDEFAULT, clientRect.right, clientRect.bottom, NULL, NULL, hInstance, NULL);

ChoosePixelFormat()当我使用仅启用了 Handles 和 Cuzz 的应用程序验证程序时,在调试器中导致无效的句柄首次机会异常。这两者一起导致异常触发。如果没有启用这两个(即使我只做一个或另一个),也不会抛出异常并且一切正常。当我在不附加到调试器的情况下运行应用程序时,应用程序反而崩溃了。

即使引发了异常,一旦我命中wglMakeCurrent()(通过在之后继续调试并忽略异常),所有变量似乎最终都以有效值结束:

mHWnd == 0x1a1064e
mHDC == 0x440119c0
format == 7
mHGLRC == 0x10000

堆栈跟踪如下所示:

ntdll.dll!00000000772012f7()
vfbasics.dll!000007feedaa81b4()
KernelBase.dll!000007fefd1610dc()
vfbasics.dll!000007feedaa7ce9()
vfcuzz.dll!000007fee5075179()
nvoglv64.dll!000000006979b732()
vfbasics.dll!000007feedaac1d5()
kernel32.dll!0000000076fa652d()
ntdll.dll!00000000771dc521()

并且活动线程是vfcuzz.dll线程,这显然允许 Cuzz 做它的业务。vfbasics.dll在堆栈跟踪中是句柄检查器所在的位置,正如我所说,仅启用了句柄检查器。

为了完整起见,这里是实际的异常消息:

First-chance exception at 0x00000000772012F7 (ntdll.dll) in Tests.exe: 0xC0000008: An invalid handle was specified.

我假设不是应用程序验证程序中的错误导致它抛出不应该存在的异常并导致程序崩溃。当我清楚地从函数调用中获取有效值时,我只是对为什么它抛出异常感到困惑。在我了解发生了什么之前,我真的不想忽略它。

4

1 回答 1

2

您的代码看起来没有问题。唯一的句柄ChoosePixelFormat是 anHDC并且你给它的那个可能是有效的(尽管在你显示的代码中没有GetDC成功的检查,我假设你只是为了简洁而忽略了它)。

第一次机会例外不一定是问题。它只是意味着发生了异常,这是处理它的第一个机会。我的猜测是异常最有可能发生在ChoosePixelFormat函数本身(或ChoosePixelFormat调用的函数中)并在那里被处理——只是因为你在调试你才真正发现它。在日常使用中,异常会被安静地处理,你甚至不会知道它已经发生了。

于 2013-08-05T19:55:23.947 回答