【问题标题】:CreateSurface in DirectDraw returns E_INVALIDARG on x64DirectDraw 中的 CreateSurface 在 x64 上返回 E_INVALIDARG
【发布时间】:2011-04-07 14:31:58
【问题描述】:

在以下代码中,hRet 在为 x64 构建时被设置为 E_INVALIDARG。

相同的代码在 32 位中始终可以正常工作。输入中唯一明显的区别是 ddsd 的大小,在 64 位模式下要大 4 个字节,因为指针大小。

HRESULT hRet;
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWSURFACE4 pTempDDrawSurface = NULL;

ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps |= DDSCAPS_PRIMARYSURFACE;

// Create primary surface
hRet = m_pRootDDrawObj->CreateSurface(&ddsd, &pTempDDrawSurface, NULL);
if (hRet != DD_OK)
    return -3;  //gets here with E_INVALIDARG, but GetLastError() is 0.

(操作系统是win7)。感谢您的建议。

【问题讨论】:

  • 这是一个自我解决的问题。这4个字节启动E_INVALIDARG,因为你运行的64位系统无法理解32位ddsd。
  • 我不确定我是否理解。你建议一个解决方案吗? im 所指的 4 个额外字节是 ddsd 中的表面 ptr。
  • 有趣,我没想到还有 x64 版本的 DirectDraw,但我在这里看到 -- blogs.msdn.com/b/chuckw/archive/2010/06/16/… 支持它。您可能刚刚发现了一个错误,如果您对结构的大小撒谎(即给它 32 位大小)会发生什么? @alexy13 你的回答似乎很荒谬,这意味着什么?

标签: graphics 64-bit directx windows-7-x64 directdraw


【解决方案1】:

解决方案:

#ifndef WIN64
#include <ddraw.h>
#else
#pragma pack(push, 8)
#include <ddraw.h>
#pragma pack(pop)
#endif

【讨论】:

    【解决方案2】:

    这是一个老问题,但我在移植一些遗留代码时遇到了同样的问题。这里的第一件事是CreateSurface() 期望 `dwSize' 字段为 0x88,而默认情况下 MSVC 将其打包为 0x80 字节。

    通过上面的 glutz 应用 pack 修复确实可以解决该问题,但是随后 CreateSurface() 调用返回 E_NOINTERFACE (0x80004002)。到目前为止,我只能猜测 x64 根本不支持 DirectDraw 表面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多