次のコードでは、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.
(OSはwin7です)。アドバイスをありがとう。