Direct3D ID3DXFont-> DrawText在Windows XP上崩溃
我想从文件中加载字体,然后在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字节
问题可能出现在绘图循环中,而不是初始化。在drawtext调用中放置断点,并在第二次调用时查找任何无效参数。
我想如果它是无效的参数,它将无法在任何一台机器上运行,但即使我使用DirectX Debug Runtime并且喷出所有可能的警告,它也可以在我的Windows 7 PC上完美运行。 – Jengerer
你的实际绘图代码是什么样的?它可以与其他字体一起使用吗?你确定它正确加载了字体吗?你应该使用'SUCCEEDED(hr)'和'FAILED(hr)'宏,因为'== 0'并不总是表示成功或失败。确切的回报值是相当重要的。 – ssube
什么是崩溃的调用堆栈? –
peachykeen:'AddFontResourceEx'不返回HRESULT,它返回已添加的字体的数量,如果失败则返回零。 – Jengerer