• ベストアンサー

DIRECTXで質問です。

お世話になります。 VC++6.0とDIRECTX9.0cを使ってゲームを作ろうとしています。 参考にと思い、MSDNサイトののDirectX によるゲームプログラミング入門の第1章3D ゲームプログラムの基礎をやることにしました。 そのサイトのサンプルプログラムをダウンロードし、VC++6.0でビルドをした後、デバッグを開始すると実行中に 「ハンドルされていない例外は○○.EXEにあります・・・」とエラーが発生しました。 しかし、ビルド後実行ファイルを単体で動かしてもエラーがでません。 調べてみると、LPD3DXBUFFERオブジェクトをリリースする時にエラーが発生しています。 LPD3DXBUFFER lpD3DBuf; HRESULT hres; hres = D3DXLoadMeshFromX( fn,D3DXMESH_SYSTEMMEM, lpD3DDevice,NULL, &lpD3DBuf, NULL, &m_nMaterials, &m_lpMesh); lpD3DBuf->Release(); ↑ これを実行したらエラー発生 何故このようなことが起こるのか、どうすればエラーが出ないのかわかりません。 皆さんのお知恵をお貸しください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

>D3DXLoadMeshFromXの返り値はいつも -2005531767、16進数だと、0x88760389 です。 >普通に考えればマイナスの値なのでエラーですよね・・・ >ただ、質問にもあるとおり、EXEファイル単体で起動したらエラーが起こらず、 >VC++のデバッガ上だと起こるので理由が分かりません。 恐らくVCから起動した場合とEXE単体の起動でカレントディレクトリが違うため、 おきている問題だと思います。 例えばXXXX\Debug\AAA.exeというファイルができたとするなら EXE起動するとカレントディレクトリがXXXX\Debug\になり VCから起動するとXXXXになります。 D3DXLoadMeshFromXで XXXX\Debug\res\a.xというファイルを読み込もうとするとき EXEで起動するときはres\a.xという相対パスですが VCからの起動だとDebug\res\a.xになります。 ところでHRESULTの結果は if ( FAILED(hr) ){ //失敗 } といった形で失敗したかどうか調べられます。 更にTCHAR* DXGetErrorString9(HRESULT hr)で エラーコードの内容がわかります。 http://www.microsoft.com/japan/msdn/library/ja/DirectX9_c/directx/htm/amgeterrortext.asp

amoban
質問者

お礼

お答え有難うございます。 まさに上の内容の通りでした。 試しにDebugフォルダにある.xファイルをDebugフォルダの上のフォルダにコピーしてからデバッガを起動したらエラーは発生しませんでした。 エラー発生の理由も聞いてみればとても納得です。 本当に有難うございました。

その他の回答 (3)

  • jgk
  • ベストアンサー率75% (104/138)
回答No.4

0x88760389はD3DXFERR_FILENOTFOUNDですね。 VC++はIDEから実行した場合、デフォルトでプロジェクトファイルのある場所がカレントディレクトリになります。 直接実行した場合は、exeのあるフォルダがカレントディレクトリになります。 相対パスで指定していしている場合、カレントフォルダを基準に探しにいくので、ファイルが見つからなかったりするということです。 解決策としては、 GetModuleFileNameでexeの場所を割り出し、 _splitpath等でパスを切り出し、 SetCurrentDirectoryするか、 切り出したパスとファイル名を結合して絶対パスにして、 関数に渡す。とかですかね。

amoban
質問者

お礼

お答え有難うございます。 下の回答の方が若干お早かったので10ptしか差し上げられなくて申し訳ありませんが、理由も分かりやすくてよいお答えを有難うございました。 ひとまずデバッグ中にしか必要としないので、プロジェクトフォルダの直下にデータ用フォルダでも作って、そこにデータ系のファイルを入れておくことで対処しようと考えています。 本当に有難うございました。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

> 普通に考えればマイナスの値なのでエラーですよね・・・ エラーかどうかは、関数の仕様を確認して判断します。 ヘルプやMSDNを参照して、正常値かどうか、異常値であればどういう意味の異常値かを確認します。 > EXEファイル単体で起動したらエラーが起こらず、VC++のデバッガ上だと起こるので こちらは見落としていましたが、Release、Debug環境では、利用するDLLなどが異なります。 極端な話、やる事やアルゴリズムは同様ですが、全く別のプログラムです。 Debugはデバッグのための処理をいろいろやってます。 Releaseでエラーが出ないってのは、プログラムが完璧だからではなく、そういうエラー検査処理が無く、問題あっても目に見えないからです。

amoban
質問者

お礼

お答え有難うございます。 MSDNのリファレンスを調べていたら、とにかく正常終了ではないことは分かりました。 有難うございました。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> lpD3DBuf->Release(); > ↑ > これを実行したらエラー発生 その前の、D3DXLoadMeshFromXの呼び出しの結果は正常終了ですか? 正しい値が設定できていない状態で、その先の処理を行うと例外やなんかで処理中断します。 ファイルをオープンに失敗しているのに、無理矢理書き込み処理を呼び出すようなもの。 例外で止まってくれなかったとしたら、HDD壊しちゃうかもしれません。

amoban
質問者

補足

D3DXLoadMeshFromXの返り値はいつも -2005531767、16進数だと、0x88760389 です。 普通に考えればマイナスの値なのでエラーですよね・・・ ただ、質問にもあるとおり、EXEファイル単体で起動したらエラーが起こらず、VC++のデバッガ上だと起こるので理由が分かりません。 作業していてバグが出たとき、どうやって対処していいのか・・・という状況です。