2011-04-07 6 views
2

다음 코드에서 x64 용으로 빌드 된 경우 hRet은 E_INVALIDARG로 설정됩니다.DirectDraw의 CreateSurface가 x64에서 E_INVALIDARG를 반환합니다.

동일한 코드는 항상 32 비트에서 정상적으로 작동합니다. 입력의 명확한 차이점은 sizeof 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) 어떤 조언을 주셔서 감사합니다.

+0

자기 해결 문제입니다. 실행중인 64 비트 시스템이 32 비트 ddsd를 인식 할 수 없기 때문에 4 바이트는 E_INVALIDARG를 시작합니다. – alexy13

+0

나는 이해하고 있는지 잘 모르겠다. 당신은 해결책을 제안합니까? 참조하는 4 바이트의 추가 바이트는 ddsd의 표면 ptr입니다. – glutz

+1

흥미롭게도 DirectDraw의 x64 버전이 있다고 생각하지 않았지만 http://blogs.msdn.com/b/chuckw/archive/2010/06/16/wither-directdraw에서 볼 수 있습니다. 그것이 지원됩니다 aspx. 방금 버그를 발견했을 것입니다. 구조체의 크기에 대해 거짓말을하면 (즉, 32 비트 크기를 지정하면) 어떻게 될까요? 그리고 @ alexy13 귀하의 응답은 무의미한 것, 그게 무슨 뜻이야? – eodabash

답변

1

솔루션 :

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

이 오래된 질문이지만, 일부 레거시 코드를 이식하는 동안 난 그냥 같은 문제 다 퉜다. 여기서 첫 번째로 CreateSurface()은 'dwSize'필드가 0x88이 될 것으로 예상하고, MSVC는 기본적으로 0x80 바이트로 압축합니다.

위의 glutz로 pack 수정을 적용해도 문제가 해결되지만 CreateSurface() 호출은 E_NOINTERFACE (0x80004002)를 반환합니다. 지금까지는 DirectDraw 서페이스가 x64에서 지원되지 않는다고 추측 할 수 있습니다.