다음 코드에서 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) 어떤 조언을 주셔서 감사합니다.
자기 해결 문제입니다. 실행중인 64 비트 시스템이 32 비트 ddsd를 인식 할 수 없기 때문에 4 바이트는 E_INVALIDARG를 시작합니다. – alexy13
나는 이해하고 있는지 잘 모르겠다. 당신은 해결책을 제안합니까? 참조하는 4 바이트의 추가 바이트는 ddsd의 표면 ptr입니다. – glutz
흥미롭게도 DirectDraw의 x64 버전이 있다고 생각하지 않았지만 http://blogs.msdn.com/b/chuckw/archive/2010/06/16/wither-directdraw에서 볼 수 있습니다. 그것이 지원됩니다 aspx. 방금 버그를 발견했을 것입니다. 구조체의 크기에 대해 거짓말을하면 (즉, 32 비트 크기를 지정하면) 어떻게 될까요? 그리고 @ alexy13 귀하의 응답은 무의미한 것, 그게 무슨 뜻이야? – eodabash