在以下代码中,为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)。谢谢你的任何建议。
答案 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表面。