无效句柄(使用应用程序验证程序)

时间:2013-08-05 14:51:40

标签: c++ winapi exception 64-bit handle

我遇到了一个我无法找到相关信息的问题。下面的代码导致了这个问题(为了简洁,我遗漏了很多代码,但正如我将解释的那样,这段代码似乎运行正常):

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);
当我使用仅启用了Handles和Cuzz的Application Verifier时,

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

即使引发了异常,一旦我点击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.

我假设它不是应用程序验证程序中的一个错误,它导致它抛出一个不应该存在并导致程序崩溃的异常。我很困惑,为什么它在抛出异常时显然我从函数调用中获取有效值。在我明白发生了什么之前,我真的不想忽视它。

1 个答案:

答案 0 :(得分:2)

它看起来不像你的代码有问题。唯一的句柄ChoosePixelFormat需要HDC,而你提供的句柄大概是有效的(尽管在代码中你显示没有检查GetDC成功,我假设你只是为了简洁而离开了。)

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