2

在以下代码中,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

2 回答 2

1

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

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

于 2014-01-21T07:26:32.623 回答
1

解决方案:

#ifndef WIN64
#include <ddraw.h>
#else
#pragma pack(push, 8)
#include <ddraw.h>
#pragma pack(pop)
#endif
于 2011-06-04T20:37:14.680 回答