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
Другие вопросы по тегам