【问题标题】:DescribePixelFormat "requires a newer version of Windows"DescribePixelFormat“需要更新版本的 Windows”
【发布时间】:2013-11-30 09:17:39
【问题描述】:

我在将编译器从 VS 2010 Ultimate 升级到 VS 2013 Professional 时遇到了一些奇怪的行为。操作系统为 Windows 7 Professional。

使用GetLastError(),我将问题追溯到DescribePixelFormat(...) 调用。在此之前,没有错误。紧接着,我收到错误 1150(显然是“指定的程序需要更新版本的 Windows。”)。

编辑:代码如下所示:

HWND window = CreateWindowEx(...);
HDC device_context = GetDC(window);

DWORD error_before = GetLastError(); //is 0
int count = DescribePixelFormat(device_context, 1, sizeof(PIXELFORMATDESCRIPTOR), NULL);
DWORD error_after = GetLastError(); //is 1150

问题仅出现在 Release x64 模式下,并且相同的代码在 VS 2010 上运行良好。这可能与 VS 2013 认为它需要 Win 8 或其他什么有关吗?这是怎么回事?

【问题讨论】:

  • 听起来像是一个经典的错误,当您实际上没有从 winapi 函数获得失败返回码时调用 GetLastError()。错了,Windows不会在没有错误的情况下通过重置错误代码的麻烦。当然,没有人可以看到你的代码来判断是不是这样,强迫我们猜测是没有效率的。

标签: visual-studio winapi directx


【解决方案1】:

您调用GetLastError 的代码不正确。 DescribePixelFormat 的文档说:

返回值

如果函数成功,返回值为最大像素格式 设备上下文的索引。此外,该函数设置 ppfd 指向的PIXELFORMATDESCRIPTOR 结构的成员 根据指定的像素格式。

如果函数失败,返回值为零。获得扩展错误 信息,请致电GetLastError

也就是说,你需要检查DescribePixelFormat函数的返回值。你没有那样做。只有DescribePixelFormat返回零的情况下GetLastError返回的值才有意义。

【讨论】:

  • 我对此感到困惑,因为我假设如果没有任何错误,GetLastError 将返回 0。阅读 GetLastError 的文档还给出了“大多数设置线程最后错误代码的函数在失败时设置它。但是,有些函数在成功时也会设置最后错误代码。”
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2020-06-19
  • 2021-09-20
  • 1970-01-01
  • 2017-12-14
  • 2018-01-26
相关资源
最近更新 更多