2011-07-19 10 views
0

ファイルからフォントをロードしてDirect3Dで使用しようとしていますが、Windows 7マシンでは完全に動作しますが、XP SP2マシンDrawTextへの最初の呼び出しは0(失敗したことを意味する)を返し、2回目の試みはプログラムがクラッシュする原因となります。Direct3D ID3DXFont-> Windows XPのDrawTextクラッシュ

Windows XPのDirect3Dにインポートされるフォントにはいくつかの制限がありますか? DrawTextが0を返すことはそれほど有用ではないので、便利なエラーコードを得る方法はありますか?私は管理:

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. 
} 

編集:私は(も問題なく返されます)ID3DXFontオブジェクトを作成する方法

if (AddFontResourceEx("ttfFiles/tf2Build.ttf", FR_PRIVATE, 0) == 0) { 
    // 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

実際のドローコードはどのように見えますか?それは他のフォントでも使えますか?フォントが正しく読み込まれていると思いますか? '== 0'は必ずしも成功または失敗を示すわけではないので、' SUCCEEDED(hr) 'と' FAILED(hr) 'マクロを使うべきです。正確な戻り値はかなり重要です。 – ssube

+0

クラッシュのコールスタックとは何ですか? –

+0

peachykeen: 'AddFontResourceEx'はHRESULTを返しません。追加されたフォントの数を返します。失敗した場合は0を返します。 – Jengerer

答えて

1

問題は、初期化ではなく描画ループ内にある可能性があります。 drawtext呼び出しにブレークポイントを置き、2番目の呼び出しで無効なパラメーターを探します。

+0

無効なパラメータであればどちらのマシンでも動作しませんが、DirectX Debug Runtimeを使用してもすべての警告が出るようにしてもWindows 7のPCで完全に動作すると思います。 – Jengerer