CreateSurface в DirectDraw возвращает E_INVALIDARG на x64
В следующем коде hRet устанавливается в E_INVALIDARG при сборке для x64.
Один и тот же код всегда работает нормально в 32 бит. Единственная четкая разница во входных данных - это размер ddsd, который на 4 байта больше в 64-битном режиме из-за размера указателя.
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 ответа
Это старый вопрос, но я столкнулся с той же проблемой при переносе устаревшего кода. Первое, что здесь CreateSurface()
ожидает, что поле `dwSize 'будет 0x88, тогда как по умолчанию MSVC упаковывает его в байты 0x80.
Применяя pack
исправить по glutz выше исправляет эту проблему, однако затем CreateSurface()
вызов возвращает E_NOINTERFACE (0x80004002). Пока я могу только догадываться, что поверхности DirectDraw просто не поддерживаются на x64.
Решение:
#ifndef WIN64
#include <ddraw.h>
#else
#pragma pack(push, 8)
#include <ddraw.h>
#pragma pack(pop)
#endif