2011-04-07 34 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. 

(操作系統是win7)。感謝您的任何建議。

+0

這是一個自我解決的問題。這4個字節會啓動E_INVALIDARG,因爲您正在運行的64位系統無法理解32位ddsd。 – alexy13 2011-04-07 20:07:59

+0

我不知道我明白。你建議一個解決方案?我提到的4個額外字節是ddsd中的一個表面ptr。 – glutz 2011-04-07 22:17:46

+1

有趣的是,我不會想到甚至有一個DirectDraw的x64版本,但我在這裏看到 - http://blogs.msdn.com/b/chuckw/archive/2010/06/16/wither-directdraw。 aspx支持。你可能剛剛發現了一個bug,如果你對它的結構大小(即給它的32位大小)說謊會發生什麼?而@ alexy13你的回答看起來毫無意義,這甚至意味着什麼? – eodabash 2011-04-11 21:34:52

回答

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上根本不受支持。

相關問題