我想從文件中加載字體,然後在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字節
你的實際繪圖代碼是什麼樣的?它可以與其他字體一起使用嗎?你確定它正確加載了字體嗎?你應該使用'SUCCEEDED(hr)'和'FAILED(hr)'宏,因爲'== 0'並不總是表示成功或失敗。確切的回報值是相當重要的。 – ssube
什麼是崩潰的調用堆棧? –
peachykeen:'AddFontResourceEx'不返回HRESULT,它返回已添加的字體的數量,如果失敗則返回零。 – Jengerer