• 締切済み

DirectXでのエラー処理について

現在、Visual Studio .NET 2003でWindowsフォームを使って C++、DirectXのプログラムを作っています。 そこでXファイルを読み込むために以下のようにしているのですが、 Xファイルが存在しない場合 「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。」 というメッセージが繰り返し出てきてreturnまで処理が進みません。 returnまで進まない原因、もしくはXファイルが存在しない場合の よい処理方法があれば教えていただけないでしょうか。 初心者なので説明足らずなところがあると思いますが よろしくお願いします。 if(FAILED(D3DXLoadMeshFromX("**.x",D3DXMESH_SYSTEMMEM,**,NULL,&**,NULL,&**,&**))){ MessageBox(NULL,"",NULL,MB_OK); return E_FAIL; } (**は全て独自、同じではありません)

みんなの回答

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.1

回答がないようなので・・・ まだお困りですか? returnまで進まないのは、例外が発生しているからです。 試していないので間違っているかもしれませんが、例外が発生しているのはD3DXLoadMeshFromXの中なんですよね? 対策としては try catch で例外を捕まえるとか、事前にファイルの有無を調べるとかになりますかね。

tsuki_dash
質問者

お礼

実は私の勘違いで、例外が発生しているのは MessageBoxの方だったんです。それが何故かはわからないんですが… 一応その1行を消せば動くようにはなりました。 でもtry catchの方がいいみたいですね。 どうもありがとうございました。

関連するQ&A

  • DirectXサンプルソース D3DXCreateEffectFromFile()で失敗

    C言語プログラマー暦10年ですが、DirectX超初心者です。 このたび、DirectXのサンプルソースをダウンロードして実行してみました。 しかし、以下の関数で失敗して先に進みません。 正常に動作するように、ご教授お願いいたします。 [関数]D3DXCreateEffectFromFile() [戻り値]E_NOTIMPL [環境]WinXP Home SP3,Microsoft Visual C++ 2005, Microsoft DirectX SDK (November 2008) [ソース一部] if (hr = D3DXCreateEffectFromFile(m_pDeviceD3D, "MyShader.fx", NULL, NULL, 0, NULL, &m_pEffect, NULL), FAILED(hr)) return hr; この関数を呼ぶ以前の処理で「m_pDeviceD3D」は正常に取得できており、MyShader.fxも存在しています。 [サンプルソースの注意書き] ビルドするためには Summer2004 以降の DirectX9.0 SDKがインストールされている必要になります. お忙しいところ、申し訳ございませんが、ご教授のほどよろしくお願いいたします。

  • DirectShowを用いたmpgファイルの再生が上手くいかないのですが

    趣味でゲームを作っているものです。ゲームのオープニングムービーでmpgファイルを再生したいのですが上手くいきません。詳細は以下の通りです。よろしくお願いします。 ゲームはウインドウモードで作成 ゲームウインドウ内にmpgファイルを再生 DirectXのバージョン DirectX9.0b ビデオボード GeForce7900GT (ドライバは最新のものを使用) 不具合点  mpgファイルの再生中にウインドウが再描画されたとき(他のウインドウに隠されて た後、再びアクティブにしたり、最小化後最大化など)ムービーの一部あるいは全部 が黒い画面になってしまいます。再描画されなければ上手くいきます。  また、aviファイルであれば、問題なく動作します。 具体的コード <初期処理部> RECT rc; long w,h; //COMライブラリの初期化 CoInitialize(NULL); //GraphBuilder オブジェクトの作成 if(FAILED(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pBuilder))){ MessageBox(NULL, "GraphBuilder オブジェクトの作成に失敗しました", NULL, MB_OK); return E_FAIL; } //フィルタ・グラフの作成 if(FAILED(pBuilder->RenderFile(L"sample.mpg",NULL))){ MessageBox(NULL, "フィルタ・グラフの作成に失敗しました", NULL, MB_OK); return E_FAIL; } // AVI描画用ウインドウを作成し... if(FAILED(pBuilder->QueryInterface(IID_IVideoWindow,(void **)&pVideoWindow))){ MessageBox(0,"AVI描画用ウインドウの作成に失敗しました",NULL,MB_OK); return E_FAIL; } // メインウインドウの子ウインドウに設定する // ウインドウハンドルの設定 if(FAILED(pVideoWindow->put_Owner((OAHWND)hwnd))){ MessageBox(0,"AVI描画用ウインドウを子ウインドウにすることに失敗しました",NULL,MB_OK); return E_FAIL; } // ウインドウスタイルの設定 if(FAILED(pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS ))){ MessageBox(0,"AVI描画用ウインドウを子ウインドウにすることに失敗しました",NULL,MB_OK); return E_FAIL; } // ウインドウサイズの設定(メインウインドウに合わせる) GetClientRect(hwnd,&rc); w=rc.right; h=rc.bottom; if(FAILED(pVideoWindow->SetWindowPosition(0,0,w,h))){ MessageBox(0,"ウインドサイズの変更に失敗しました",NULL,MB_OK); return E_FAIL; } // メディアコントロールの取得 if(FAILED(pBuilder->QueryInterface(IID_IMediaControl,(void **)&pMediaControl))){ MessageBox(0,"メディアコントロールの取得に失敗しました",NULL,MB_OK); return 0; } // メディアイベントの取得 if(FAILED(pBuilder->QueryInterface(IID_IMediaEvent,(void **)&pMediaEvent))){ MessageBox(0,"メディアイベントの取得に失敗しました",NULL,MB_OK); return 0; } //ウインドウメッセージの受け取り準備 if(FAILED(pBuilder->QueryInterface(IID_IMediaEventEx,(void **)&pMediaEventEx))){ MessageBox(0,"メディアイベントの作成に失敗しました",NULL,MB_OK); return E_FAIL; } if(FAILED(pMediaEventEx->SetNotifyWindow((OAHWND)hwnd,WM_GRAPHNOTIFY,0))){ MessageBox(0,"メッセージの設定に失敗しました",NULL,MB_OK); return E_FAIL; } <コールバック関数にて> long ecode,param1,param2; //DirectShow用 switch(iMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_KEYDOWN: switch((CHAR)wParam) { case VK_ESCAPE: PostQuitMessage(0); return 0; } // DirectShow用 case WM_GRAPHNOTIFY: while(SUCCEEDED(pMediaEventEx->GetEvent(&ecode,&param1,&param2,0))){ switch(ecode){ case EC_COMPLETE: case EC_END_OF_SEGMENT: case EC_WINDOW_DESTROYED: if(FAILED(pMediaControl->Stop())){ MessageBox(0,"停止に失敗しました",NULL,MB_OK); return 0; } GameStartFlag=true; } } break; } return DefWindowProc (hWnd, iMsg, wParam, lParam) ;

  • 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で質問です。

    お世話になります。 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(); ↑ これを実行したらエラー発生 何故このようなことが起こるのか、どうすればエラーが出ないのかわかりません。 皆さんのお知恵をお貸しください。 宜しくお願いします。

  • 今DirectSoundの初期化でわからないことがあります。カレントデ

    今DirectSoundの初期化でわからないことがあります。カレントディレクトリにもsoundファイルにもwavファイルがあるのにうまく読み込まれません。また、mmioRead関数でなぜか失敗時の処理が出てしまいます。下に一部省略したソースを書きます。 if(FAILED(hr = OpenWaveFile(aWaveFileName, aSound))) { TCHAR strWavFile[MAX_PATH]; TCHAR kSoundsPath[6]={'s','o','u','n','d','/'}; int kSoundsPathLength=6; lstrcpyn(strWavFile, kSoundsPath, MAX_PATH); lstrcpyn(strWavFile + kSoundsPathLength, aWaveFileName, MAX_PATH - kSoundsPathLength); if(FAILED(hr = OpenWaveFile((LPSTR)strWavFile, aSound))) { sprintf(tmpString, "wavファイル『%s』が見つかりませんでした", strWavFile); goto FAIL_RETURN; } HRESULT Sound::OpenWaveFile(LPSTR aWaveFileName, theSounds *aSound) { mmioOpen→mmioDescend →aChunkInfo.ckid = mmioFOURCC('f', 'm', 't', ' '); if(MMSYSERR_NOERROR != mmioDescend(aSound->sndHmmio, &aChunkInfo, &(aSound->sndChunkRiff), MMIO_FINDCHUNK)) { MessageBox(NULL, "FAIL:mmioDescend2","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return(E_FAIL); } →if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat, sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat)) { MessageBox(NULL, "FAIL:mmioRead","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return (E_FAIL); } } ソースは以上です。誰か原因に心当たりがある方がいましたら回答お願いします。

  • 宣言による処理の重さ

    第161章 キーボード・フック http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm このサイトのLRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)で {   char str[256];   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } と書いてありますが、char str[256];をstatic char str[256];にしたり、 {   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     char str[256];     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } にするとアプリケーションのパフォーマンスはよくなりますか?

  • DirectXによる通信ができなくて困っています。

    DirectX9のDirectPlayで通信をしようとしているのですが、セッションへの接続が出来なくて困っています。 言語はC++で開発環境はVisualC++6.0です。プログラムは自分で組んだもので、ピアツーピア型。ホストとピア両方が出来るようにプログラムを組んで、同じプログラムを二つ起動して同一のマシンで実行しています。 接続が出来ない原因を調べたところ以下のセッションへの接続部分でプログラムが1~2分ほど固まり、その後接続に失敗していました。 hr = lpDirectPlay8Peer->Connect(&dpnAppDesc2, prgHostAddr,prgDeviceInfo2, NULL, NULL, NULL, 0, NULL, NULL, NULL,DPNCONNECT_OKTOQUERYFORADDRESSING | DPNCONNECT_SYNC); 接続に失敗した後、このエラー処理で接続に失敗した事は分かるのですが原因が分かりません。又、アドレスの設定やホストが確立しているかも同様の方法でエラーの判断をしています。 if (FAILED(hr)) //エラー処理 {MessageBox("セッションの接続に失敗", "PeerVoice", MB_OK | MB_ICONWARNING);} else {MessageBox("セッションの接続に成功", "PeerVoice", MB_OK | MB_ICONWARNING);} MSDNのIDirectPlay8Peer::Connectメソッドの項を見るとエラー時の戻り値でエラー原因が分かるようなので以下の様なコードを書きました。 switch (hr){ case S_OK: MessageBox("成功1", "PeerVoice", MB_OK |MB_ICONWARNING); break; case DPNSUCCESS_PENDING:("成功2", "PeerVoice", MB_OK |MB_ICONWARNING);break; case DPNERR_HOSTREJECTEDCONNECTION: MessageBox("失敗1", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDAPPLICATION : MessageBox("失敗2", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDDEVICEADDRESS : MessageBox("失敗3", "PeerVoice", MB_OK | MB_ICONWARNING); break; case DPNERR_INVALIDFLAGS: MessageBox("失敗4", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDHOSTADDRESS: MessageBox("失敗5", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDINSTANCE: MessageBox("失敗6", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDINTERFACE: MessageBox("失敗7", "PeerVoice", MB_OK | MB_ICONWARNING);break; case DPNERR_INVALIDPASSWORD: MessageBox("失敗8", "PeerVoice", MB_OK | MB_ICONWARNING); break; case DPNERR_NOCONNECTION: MessageBox("失敗9","PeerVoice", MB_OK| MB_ICONWARNING);break; case DPNERR_NOTHOST: MessageBox("失敗10", "PeerVoice", MB_OK|MB_ICONWARNING);break; case DPNERR_SESSIONFULL: MessageBox("失敗11", "PeerVoice",MB_OK| MB_ICONWARNING);break; default: MessageBox("失敗0", "PeerVoice",B_OK|MB_ICONWARNING);break; } しかし、これでもdefaultの失敗0のメッセージボックスが出てきてしまいます。何かの設定ミスやホストがいないのなら上記のエラー処理で原因が特定できると思ったのですが、全くわけが分かりません。どうか理由が分かる方回答をお願いいたします。

  • DirectX サンプル エラー

    こんにちは。DirectXプログラミング初心者です。 Visual C++ 2005 Express Editonで開発しております。 Platfrom SDKもインストール済みです。 DirectX 9.0 SDKの最新版のサンプルをコンパイルしようとすると、 fatal error C1083: include ファイルを開けません。'dimm.h': No such file or directory とエラーがでてコンパイル出来ません。 また、工学社の「DirectX9 DirectX Graphics」という本に付属しているDirectX 9.0 SDK(December 2004)をインストール(新しいSDKを消して)して、付属のサンプルをコンパイルすると、 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _DXTraceW@20 が関数 "long __cdecl InitApp(struct HINSTANCE__ *)" (?InitApp@@YAJPAUHINSTANCE__@@@Z) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateSprite@8 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileW@12 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 Debug/DXGSample01.exe : fatal error LNK1120: 外部参照 4 が未解決です。 と出てきます。 コンパイラの方の「プロパティ」→「構成プロパティ」→「リンカ」→「入力」の「追加の依存ファイル」に d3d9.lib d3dx9dt.lib dxerr9.lib dxguid.lib の4つは追加済みです。 インクルードパス・ライブラリパスがおかしいのでしょうか? ご回答お願いいたします。

  • DirectXについて

    題の通りDirectXについてなのですけれど、 先程PCゲームのアプリケーションをインストールしたのですが いざ始めようとアプリを開始したところ、 下記の内容の窓が表示されました。 ________________________________ th10tr.exe - コンポーネントが見つかりません d3dx9 31.dll が見つからなかったため、このアプリケーションを開始できませんでした。 アプリケーションをインストールし直すとこの問題は解決される場合があります。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 文に従いアンインストール・再DL/インストールを行いましたが、何度繰り返しても上記の窓が表示されるばかり。 なにか他に原因があるのではないかと思い「教えて!」を閲覧しました。 類似の質問があったので見てみると、 DirectXの8.0以降がインストールされていないとアプリケーションが開始できないとのことでした。 DirectXは最新版を入れていたような…等疑問は残りましたが、とりあえずインストールしようとすると今度は 「ファイルをダウンロードできませんでした」 と表示されてもう八方塞がり状態に… どなたか解決方法、わかりませんか?悩み始めてもう1ヶ月経ちます><

  • DIRECTXがうまくインストールできません

    現在XPSP2でDIRECTX(9.0 SDK 2005 February)をインストールしようとしているのですが、インストール時「DirectX Runtime Setup Failed (-9)」が表示され、 一応インストールはできるのですが、Cで組んだプログラムを起動すると「d3dx9_24.dllが見つかりません」と表示され実行してくれません。 セットアップファイルはマイクロソフトのHPからダウンロードしたものを使い、Runtimeも最新のものにしています。 インストール時は前のSDKはRemoveしています。 どなたかおわかりになる方教えて下さい。

専門家に質問してみよう