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

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

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.

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

最佳答案

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

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

关于c++ - 句柄无效(使用应用程序验证程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18061192/

相关文章:

c++ - 进程结束后的 DLL 支持

c++ - 从某个文本文件中检索所有数字

php - 有人知道 PHP 的默认异常代码吗?

debugging - Visual Studio - 如何将调试器附加到重新启动的应用程序?

windows - 在 Windows 设备管理器中以编程方式卸载设备

java - 最佳实践——service/dao/business层的异常处理

Java 异常和 throw 子句

c++ - 如何在 Visual Studio 2012 中创建和运行简单的 C++ 程序?

c++ - 将 QClipboard 传递给 QML

c# - 如何在外部 Win32 应用程序窗口上添加 WPF 覆盖?