2011-07-19 61 views
0

我想從文件中加載字體,然後在Direct3D中使用它,它在我的Windows 7機器上完美工作,但如果我在XP SP2機器上嘗試它,第一次撥打DrawText將返回0(表示失敗),第二次嘗試將導致程序崩潰。Direct3D ID3DXFont-> DrawText在Windows XP上崩潰

在Windows XP上Direct3D中的導入字體是否存在一些限制?有沒有辦法我可以得到一些有用的錯誤代碼,因爲DrawText返回0對它本身並不是很有幫助。

供參考,這是我的字體輸入代碼:

if (AddFontResourceEx("ttfFiles/tf2Build.ttf", FR_PRIVATE, 0) == 0) { 
    // Throw exception. 
} 

這裏就是我如何創建ID3DXFont對象(也返回沒有問題):

HRESULT result = D3DXCreateFont(
    d3dDevice_, 
    height, 
    0, 
    isBolded ? FW_BOLD : FW_NORMAL, 
    0, 
    false, 
    DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, 
    DEFAULT_QUALITY, 
    FF_DONTCARE, 
    name.c_str(), 
    &d3dFont); 

if (FAILED(result)) { 
    // Throw exception. 
} 

編輯:我管理讓它在XP下的調試器下發生,這裏是出現的非常可怕的錯誤:

DirectFont.exe中發生未處理的異常'System.AccessViolationException' 附加信息:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。

這裏是堆棧跟蹤:

的usp10.dll ClientData :: GetOtlTable()+ 0x35字節
的usp10.dll otlResourceMgr :: getOtlTable()+ 0x7a字節
USP10! .DLL!SubstituteOtlChars()+ 0x1af字節
的usp10.dll!OtlShape()+ 0x3c5字節
D3DX9_43.dll!D3DXCore :: ::的CFont DrawTextAW()+ 0x5aa字節 D3DX9_43.dll!D3DXCore :: ::的CFont DrawTextA()+ 0x26字節

+0

你的實際繪圖代碼是什麼樣的?它可以與其他字體一起使用嗎?你確定它正確加載了字體嗎?你應該使用'SUCCEEDED(hr)'和'FAILED(hr)'宏,因爲'== 0'並不總是表示成功或失敗。確切的回報值是相當重要的。 – ssube

+0

什麼是崩潰的調用堆棧? –

+0

peachykeen:'AddFontResourceEx'不返回HRESULT,它返回已添加的字體的數量,如果失敗則返回零。 – Jengerer

回答

1

問題可能出現在繪圖循環中,而不是初始化。在drawtext調用中放置斷點,並在第二次調用時查找任何無效參數。

+0

我想如果它是無效的參數,它將無法在任何一臺機器上運行,但即使我使用DirectX Debug Runtime並且噴出所有可能的警告,它也可以在我的Windows 7 PC上完美運行。 – Jengerer

相關問題