- ベストアンサー
BCCでのTexture使用に関するError?
- BCC5.5とDirectX9.0bを使用している環境で、D3DXCreateTextureFromFileでErrorが出ています。
- コンパイルは通るが、実行時にD3DX81ab.DLLが必要であり、その後は起動するがエラー終了してしまいます。
- デバッガを使用して調べた結果、texture使用の部分でエラーが発生しています。具体的な原因は分かりません。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
字数制限は仕方ないとして確認したいことが幾つか。 BOOL InitD3DObject(void) という関数は省略なしに全部貼り付けられているということでいいですか? そして pSprite という変数はグローバル変数ですか? InitD3DObjectの呼び出し元はどこですか? WinMain? 仮に、InitD3DObjectの中身を展開した場合、 状況は変わりますか? InitD3DObject(); となっているところを if(pSprite){ pSprite->OnResetDevice(); } に置き換えるということです。 が、 この関数は常に return true するということでいいんでしょうか? まあ展開するときは不要になりますが。 隔靴掻痒の感がありますがよろしくお願いします。
その他の回答 (5)
- sakusaker7
- ベストアンサー率62% (800/1280)
すみません。お知らせメールは受け取っていたのですが すっかり忘れていました。 >>仮に、InitD3DObjectの中身を展開した場合、 >>状況は変わりますか? > >展開してテストしましたが結果は変わりませんでした。 InitD3DObjectを展開する前は、たしかその関数の末尾の'}'で こけるとかいう話ではなかったでしたっけ? とすると、展開した後もこけるというならその原因はどんなものですか? #例の「メモリが writtenになれませんでした」とかいうものでしょうか もし可能なら、落ちている箇所付近の逆アセンブリリストをとれませんか? UNIX環境みたいにバックトレースが取れるといいんですがこれは無理ですしねえ。
お礼
返信遅くなってすいません。 先日HDDが故障しまして開発環境を再構築して ソースも書き直したのですが、 何故か正常に動作してしまいました。 (動作してしまったという言い方はおかしいのかな? 環境の設定が間違っていたのか ソースの書き直しの際に直してしまったのか不明ですが。 たぶん環境の設定が間違っていたのだと思いますが、 このような事で長々と付き合わせてしまい申し訳ありません。
- sakusaker7
- ベストアンサー率62% (800/1280)
VC++ではまったく同じコードをコンパイルして正常に動いたということなので BCCのバグという可能性はあるかもしれませんが、 ここまでで提示されているコードが断片的なものでしかないので 断言はできません。 もうちょっと全体の様子がわかるコードが読めればいいんですが。 BCCでこけているのはDirectX関連の初期化をしている関数の中ですか? もしそうならその関数のコードだけでもみられないでしょうか。
お礼
HRESULT InitDX9(void) { HRESULT hr; gl_lpD3d = Direct3DCreate9(D3D_SDK_VERSION); if( !gl_lpD3d ) { MessageBox(hWnd, "DirectXD3Dオブジェクト生成失敗", "ERROR", MB_OK); return E_FAIL; } /-----------中略---------------/ if(FAILED(D3DXCreateTextureFromFile(gl_lpD3ddev,gl_disp,&pTexture))) { MessageBox(hWnd, "Texture生成失敗", "ERROR", MB_OK); return E_FAIL; } hr = D3DXCreateSprite(gl_lpD3ddev, &pSprite); if(FAILED(hr)) { return DXTRACE_ERR("InitDXGraphics D3DXCreateSprite", hr); } if(InitD3DObject()){ return DXTRACE_ERR("InitDXGraphics D3DXinitSprite", hr); } return S_OK; } /*------------------------------------------- D3Dに管理されないオブジェクトの初期化 --------------------------------------------*/ BOOL InitD3DObject(void) { // スプライトの処理 if(pSprite){ pSprite->OnResetDevice(); } return true; } <-ここが問題の場所です。 BCC用のライブラリとして http://www.clootie.ru/cbuilder/index.html ここのDX90を使用しています。 文字数制限に引っかかったのでこれ以上長いソースが・・・。
- sakusaker7
- ベストアンサー率62% (800/1280)
> BCCDevでTurboDebuggerを使用してトレースしていくと > 最後の}の部分で > 00000000->???? > に飛んで、 > Stopped on exception throw > と出てとまってしまう状態です。 000... になる前のその表示はどんな感じですか? 関数末尾の'}'にステップインするとそうなるのでしょうか。 ひとつ、今デバッグしている関数の中で配列を宣言していて使っているが、その配列の領域をはみ出して 読み書きをしてしまっていて関数からのリターンアドレスを書きつぶしているのではないか ということが思いつきます。 コンパイラによってはリターンアドレスを書きつぶしていないかちぇっくできる ものもあるのですが、Borlandのコンパイラにはなかったと思います。
お礼
返事が遅れてすいません。 77F88553->B81C000000 mov eax,0000001C 77F88558->8D542404 lea edx,[esp+04] 77F8855C->CD2E int 2E ----------ここで止まります---------------- 77F8855E->E9172B0100 jmp NTDLL.77F9B07A NTDLL.NtSetEvent eax 00000001 edx 0012FC60 ・・・ esp 0012FC54 ステップイン時は大丈夫のようです。 ちょっとVC++で試してみたところ、 まったく同じソースで問題なく動きました。 BCCでもSprite関係をコメントアウトすると動作するという事は、 Sprite関係の仕様が違うのでしょうかね? 的外れな意見でしたら申し訳ないです。
- sakusaker7
- ベストアンサー率62% (800/1280)
エラーがでるというのは、不正な処理をしましたとかなんとかの ダイアログボックスが表示されるということでしょうか? 「エラーになりました」ではなく、どのようなエラーがどのように 発生したのかをきちんと書いてください。 デバッガで追えないというのは変ですね。デバッグ情報とコードの対応が おかしくなっているとか? インクリメンタルコンパイル/リンクを切って、再構築してみてはどうでしょう。
お礼
>不正な処理をしましたとかなんとかの >ダイアログボックスが表示されるということでしょうか? >「エラーになりました」ではなく、どのようなエラーがどのように >発生したのかをきちんと書いてください。 確かにその通りですね。書き方がまずくて申し訳ないです。 で、Errorは不正な処理としてダイアログボックスがでます。 >以下エラーメッセージ アプリケーションエラー。 エラーが発生したためtest02.exeを終了します。 プログラムをもう一度開始する必要があります。 BCCDevでTurboDebuggerを使用してトレースしていくと 最後の}の部分で 00000000->???? に飛んで、 Stopped on exception throw と出てとまってしまう状態です。 一応ですが毎回再構築しているつもりです。 BCCDevで準備されている再構築を使用しています。
- sakusaker7
- ベストアンサー率62% (800/1280)
DirectXはよくわかりませんが回答がつかないようなので。 hr = D3DXCreateTextureFromFile(gl_lpD3ddev,gl_disp,&pTexture); if(FAILED(hr)) return DXTRACE_ERR("InitDXGraphics D3DXCreateTextureFromFile", hr); ここの、FAILD(hr) の判定が真になっているということですよね? このとき、hrには具体的なエラーコードも入っていると思うんですが、 それはどうなっていますか? エラーコードからどのような理由でエラーになっているのかを 探ってみてはどうでしょうか?
お礼
回答ありがとうございます。 書き方がまずかったですね。 if文に入る前にErrorがでてしまい異常終了してしまいます。 debuggerでトレースしていくと関数実行時にとまってしまいます。 if(FAILD(D3DXCreateTextureFromFile( gl_lpD3ddev,gl_disp,&pTexture))) に書き直したら改善できました。 しかし今度はSpriteでErrorが・・・。 //関数呼び出し部分 hr = InitD3DObject(); if(FAILED(hr){ return DXTRACE_ERR("InitDXGraphics D3DXinitSprite", hr); } return S_OK; } HRESULT InitD3DObject(void) { // スプライトの処理 if(pSprite){ pSprite->OnResetDevice(); } return S_OK; } debuggerでトレースすると最後の}部分でErrorがでてしまいます。 戻り値周りが変なのでしょうか?
お礼
>BOOL InitD3DObject(void) >という関数は省略なしに全部貼り付けられているということでいいですか? はい。省略はしていません。 >pSprite という変数はグローバル変数ですか? グローバルで宣言しています。 >InitD3DObjectの呼び出し元はどこですか? >WinMain? WinMainでInitDX9というDX関係の初期化処理関数を呼び出して その関数内で呼び出しています。 >仮に、InitD3DObjectの中身を展開した場合、 >状況は変わりますか? 展開してテストしましたが結果は変わりませんでした。 >この関数は常に return true するということでいいんでしょうか? そのとおりです。 でもこれって無駄ですよね? やるならエラー時にfalse返すようにしないと(汗