DirectDraw中的CreateSurface在x64上返回E_INVALIDARG

时间:2011-04-07 14:31:59

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

在以下代码中,为x64构建时,hRet设置为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)。谢谢你的任何建议。

2 个答案:

答案 0 :(得分:1)

溶液:

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

答案 1 :(得分:1)

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

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