CreateSurface в DirectDraw возвращает E_INVALIDARG на x64 - PullRequest
2 голосов
/ 07 апреля 2011

В следующем коде 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 ]

1 голос
/ 21 января 2014

Это старый вопрос, но я столкнулся с той же проблемой при переносе устаревшего кода. Во-первых, CreateSurface() ожидает, что поле `dwSize 'будет 0x88, тогда как по умолчанию MSVC упаковывает его в байты 0x80.

Применение исправления pack с помощью glutz выше исправляет эту проблему, однако тогда вызов CreateSurface() возвращает E_NOINTERFACE (0x80004002). До сих пор я могу только догадываться, что поверхности DirectDraw просто не поддерживаются в x64.

1 голос
/ 05 июня 2011

решение:

#ifndef WIN64
#include <ddraw.h>
#else
#pragma pack(push, 8)
#include <ddraw.h>
#pragma pack(pop)
#endif
...