• ベストアンサー

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++のデバッガ上だと起こるので理由が分かりません。 作業していてバグが出たとき、どうやって対処していいのか・・・という状況です。

関連するQ&A

  • DirectXについて

     僕は某オンラインゲームをインストールしました。 そして、動作環境を見てみるとどうやらDirectX9.0cが必要なようでこれと、DirectX エンド ユーザー ランタイム Web インストーラを外付けHDDにインストールしました。 そして、ゲームを起動しようとすると、なんか「コンピューターに d3dx10_43.dll がないため、プログラムを開始できません。」というエラーが出て来ます。   どうやらd3dx10_43.dllはDirectXの事らしいのですが、なぜちゃんとDirectX9.0cを入れてるのにこのようなエラーが出るのでしょうか?  DirectX9.0cやユーザーランタイムを外付けHDDにインストールしたからでしょうか?  あっ、そういえば元々PCにはDirectX11が入ってるのですが、それが原因ですかね? まあとにかくDirectX9.0cをしっかり入れてるのになぜコンピューターにないというエラーが出るのかを知りたいです。 よろしくお願い致します。

  • DirectX 2005 Aprilのコンパイルについて

    DirectX SDK summer2003で開発していたのですがDirectX SDK 2005 Aprilが出たのを機にバージョンアップをしたところ今までコンパイルできていたサンプルがコンパイル出来なくなってしまいました。 次のようなエラーが出ました。 error C2664 'D3DXLoadMeshFromXof':1番目の引数を'LPDIRECTXFILEDATA'から'LPD3DXFILEDATA'に変換できません error C2061 構文エラー 識別子'LPDIRECTXFILEDATA' です。 どなたか対処の方法ご存知の方教えていただけないでしょうか。 開発環境はVC++.net2003です。

  • DirectXについて

    僕は某オンラインゲームをインストールしました。 そして、動作環境を見てみるとどうやらDirectX9.0cが必要なようでこれと、DirectX エンド ユーザー ランタイム Web インストーラを外付けHDDにインストールしました。 そして、ゲームを起動しようとすると、なんか「コンピューターに d3dx10_43.dll がないため、プログラムを開始できません。」というエラーが出て来ます。   どうやらd3dx10_43.dllはDirectXの事らしいのですが、なぜちゃんとDirectX9.0cを入れてるのにこのようなエラーが出るのでしょうか?  DirectX9.0cやユーザーランタイムを外付けHDDにインストールしたからでしょうか?  あっ、そういえば元々PCにはDirectX11が入ってるのですが、それが原因ですかね? まあとにかくDirectX9.0cをしっかり入れてるのになぜコンピューターにないというエラーが出るのかを知りたいです。  *知ってる方は教えて欲しいですが、11から9.0cにダウングレード出来ますか? もし、出来ないならどうすればオンラインゲームはプレイ出来ますか? ちなみにオンラインゲームはあの有名なWOTというゲームです。 よろしくお願い致します。

  • Directxについて

    1つご教授お願い申したいのですが、 HRESULT DrowInitialize(HWND hWnd) { LPDIRECT3D9 g_pD3D; D3DPRESENT_PARAMETERS g_D3DPP; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D==NULL) { return S_FALSE; } ZeroMemory(&g_D3DPP,sizeof(g_D3DPP)); g_D3DPP.Windowed =TRUE; g_D3DPP.SwapEffect =D3DSWAPEFFECT_DISCARD; g_D3DPP.BackBufferFormat = D3DFMT_UNKNOWN; HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { return S_FALSE; } } } return S_OK; } なのですが、これが通らなくて困っています。(S_FALSEを通ってしまいます)S_OKを通るにはどうしたらいいのでしょうか。わかる方いらしたらよろしくお願いします。

  • ローディング画面をマルチスレッドで動かせません。

    ローディング画面をマルチスレッドで動かせません。 DirectXとC++をVisualStudio2010でゲームを制作しています。 ローディング画面を動かせるようにマルチスレッドにしているんですが、パソコンによってはローディング画面から動かなくなってしまいます。(開発環境では、問題なく動きます) スレッドの呼び出し部分は以下のようになっています。 HANDLE thread; CScene gamen; //タイトル画面やメインゲーム画面などのシーンを管理 void Loading() { SetDrawLoading( true ); delete gamen; gamen = new CTitleGamen(); thread = (HANDLE)_beginthreadex(NULL,0,DrawLoading,NULL,0,NULL); gamen->LoadData(); //クラス内の画像や音楽データを読み込み effect->SetDrawLoading(false); WaitForSingleObject( thread, INFINITE ); CloseHandle(thread); } マルチスレッド部分は以下のように、 drawLoading変数がtrueの間、ローディング画面を描画するようにしています。 D3DXMATRIX m_world; unsigned __stdcall DrawLoading(void *p){ LPDIRECT3DTEXTURE9 pTexture; D3DXCreateTextureFromFileEx(m_pD3DDevice, TEXT("texture.png"),16, 16, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT, D3DCOLOR_XRGB(255,255,0), NULL, NULL, &pTexture)) do{ m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); if( SUCCEEDED( m_pD3DDevice->BeginScene() ) ) { D3DXMatrixIdentity( &m_world ); m_pD3DDevice->SetTransform( D3DTS_WORLD, &m_world ); m_pSprite->Begin( D3DXSPRITE_ALPHABLEND ); m_pSprite->Draw( pTexture, NULL, NULL, &D3DXVECTOR3( timeGetTime()%800), 550, 0 ), 0xffffffff ); m_pSprite->End(); m_pD3DDevice->EndScene(); } m_pD3DDevice->Present( 0, 0, 0, 0 ); }while( effect->GetDrawLoading() ); pTexture->Release(); _endthreadex(0); return 0; } どなたか、ご教授お願い致します。

  • DirectX9 lib関連

    DirectX9のGraphicsを使用したいので d3d9.libをリンクしたいのですが、プロジェクトのリンカの中に設定してビルドをすると、【d3d9.lib】は見つかりません。 とエラーが出てしまいます。 DirectX9はインストール済みです。 Microsoft DirectX SDK (August 2006)もインストール済みです。 どうやったら、ビルドが通るようになりますでしょうか? 知っているかたいましたら、ご教授願います。 よろしくお願いいたします。

  • DirectXプログラミングの参考書を読んで

    『マスタリングDirectXプログラミング 橋口ゆうすけ著』を読みながら、ゲームプログラミングの練習をしているのですが、このプログラムを実行してもエラーが出て実行できません。 エラーがでているのは #include <d3dx9.h> の部分。 エラー内容は include ファイルを開けません。'd3dx9.h': No such file or directory です。 その内容どおりd3dx9.hというファイルがないからなんでしょうけど。。。 本書ではこの内容を実行してみてと書いてあります。 ということは実行できるはず・・・ ちなみに、本書の内容は「DirectX SDK(August 2007)」を用いて・・・と書いてあるんですが、その意味がよくわかっていません。 これが原因なのでしょうか? それともd3dx9.hというファイルがないからなんでしょうか? とは言え、#include <windows.h>や#include <basetsd.h>という行はエラーなく読み込んでいるようなんですが。。。(そんなファイルないよ・w・; なにかアドバイスお願いします。

  • DirectXのインストールができません

    自宅のパソコンでゲームをしようとしたところ、「コンピューターにd3dx9_35dllがないため、プログラムを開始できません」と出ます。 パソコンがネットに繋がっていなく知識もないため知人に相談したところ、DirectXというものをUSBメモリに頂き実行しました。 dxwebsetupというものを開いて同意、完了と行ったのですがゲームは変わらず開くことができません。 過去の質問等も調べ、dxdiagでバージョンを確認してもDirectX 11となっていて更新されていないように思います。(更新プログラム?の方はDirectX 9.0cとなっています。) どのようにしたらゲームが起動できるようになるのか、教えて頂けないでしょうか。

  • メモリの解放について

    C++でDirectXを用いたゲームを作成しているのですが、プログラムのコンパイルは通るのに、メモリの解放関数が行われると強制終了されエラーメッセージが出力されます。 デバッグをしてみて要因を調べてみましたが、特に強制終了するような問題があるとも思えないのです。(ただ自分の知識不足であると思いますが) ためしにエラーが出ている部分をコメントにしてみたら、そしたらヒープが壊れてるとのエラーメッセージが出るのですがどう対処したらいいでしょうか? ちなみにRELEASEする変数の中身はちゃんと入ってます。 ソース: const int MAXFONT = 16; LPD3DXFONT g_pxfonts[MAXFONT]; LPD3DXSPRITE g_ptextsprite = NULL; int d=0; void DirectGraphics::CleanupD3D(){ //フォント解放 for(d=0; d<MAXFONT; d++){ if(g_pxfonts[d]!=NULL){ g_pxfonts[d]->Release();//エラー } } if(g_ptextsprite) g_ptextsprite->Release();//エラー //メッシュ、テクスチャ解放 for(d=0; d<MAXMODEL; d=d+1){ if(g_models[d].used == TRUE){ if(g_models[d].pmaterials != NULL){ delete[] g_models[d].pmaterials; } if(g_models[d].ptextures != NULL){ for(DWORD j=0; j<g_models[d].nummaterials; j=j+1){ g_models[d].ptextures[j]->Release(); } delete[] g_models[d].ptextures; } if(g_models[d].pmesh != NULL){ g_models[d].pmesh->Release(); } } } if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } エラーの出ているフォントの変数の中身はこちらに入れております。 //ゲーム用のフォントを作成 int DirectGraphics::CreateGameFont(LPCTSTR fontname, int height, UINT weight){ //空いている要素を探す int idx; for(idx=0; idx<MAXFONT; idx=idx+1){ if(g_pxfonts[idx] == NULL) break; } if (idx>=MAXFONT) return -1; //フォントを作成する HRESULT hr = D3DXCreateFont( g_pd3dDevice, -height, 0, weight, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, fontname, &g_pxfonts[idx]); if( FAILED( hr ) ) return -1; return idx; }

  • DirectX:描画されません・・・ヒント下さい・・・

    VCでC++を使ってDirectXを使ったプログラムを書いてます。 そういう仕事しているわけではなく、素人です。 DirectXは色々とややこしくて、何がなんだかさっぱりです。 とりあえず、Win32APIを使って、ウィンドウを表示し、DirectXを使って、ボタンを押すことで、ウィンドウモードとフルスクリーンモードを切り替えることの出来るプログラムは作れました。 しかし、3Dのモデルが表示されません。 何が駄目なのかが、さっぱりです。 こういう場合、何に原因があることが多いのでしょうか?? DirectX経験者の方、どうか、教えてください。お願いします。 以下に現在の状況を列挙します。 足りなければ、ご指摘ください。 ソースは見せることはできるのですが、かなり、スパゲティーなので・・・・。 DirectX:November 2008 目標:Xファイルからじゃなく座標を自分で指定して立方体を描画したい 出来ていると思われること ・Win32APIを使ったウィンドウの作成 ・Direct3Dオブジェクトの作成Direct3DCreate9⇒  D3DDeviceオブジェクトのプレゼンテーションパラメータの設定 ・カメラとライトの設定 ・あと、DirectXのメソッドで背景色だけは変えられます。 経験者の方がた、よろしくお願いします!!