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字节

+0

你的实际绘图代码是什么样的?它可以与其他字体一起使用吗?你确定它正确加载了字体吗?你应该使用'SUCCEEDED(hr)'和'FAILED(hr)'宏,因为'== 0'并不总是表示成功或失败。确切的回报值是相当重要的。 – ssube

+0

什么是崩溃的调用堆栈? –

+0

peachykeen:'AddFontResourceEx'不返回HRESULT,它返回已添加的字体的数量,如果失败则返回零。 – Jengerer

问题可能出现在绘图循环中,而不是初始化。在drawtext调用中放置断点,并在第二次调用时查找任何无效参数。

+0

我想如果它是无效的参数,它将无法在任何一台机器上运行,但即使我使用DirectX Debug Runtime并且喷出所有可能的警告,它也可以在我的Windows 7 PC上完美运行。 – Jengerer