我有一个问题,我无法找到相关信息。以下代码导致了问题(为简洁起见,我省略了很多代码,但正如我将解释的,这段代码似乎工作正常):
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.
我假设不是应用程序验证程序中的错误导致它抛出不应该存在的异常并导致程序崩溃。当我清楚地从函数调用中获取有效值时,我只是对为什么它抛出异常感到困惑。在我了解发生了什么之前,我真的不想忽略它。