2007年10月05日

DirectX 9: 関数の返すHRESULT型について

DirectXのDirect3Dメソッドの戻り値にHRESULT型がある。実行した関数が何らかの原因でエラーとなった場合に、D3DERR列挙型でエラーの区分を戻り値として返す。ユーザーが定義する関数の戻り値としてHRESULT型を定義する場合などもD3DERR列挙型の定義に従って戻した方が自然であるので、以下によく用いる列挙名やマクロとそのメモをしておく。

#define FAILED(Status) ((HRESULT)(Status)<0)
#define SUCCEEDED(Status) ((HRESULT)(Status)>=0)

S_OK
→エラーは発生していない
E_FAIL
→Direcnt3D サブシステム内で原因不明のエラーが発生した
E_INVALIDARG
→無効なパラメータが関数に渡された
E_OUTOFMEMORY
→Direct3D が呼び出しを完了するための十分なメモリを割り当てることができなかった。

ところでS_OKと似た形態であるS_FALSEというものがあるが、MSDNで調べてみると、COMライブラリが既に初期化されている場合に返される値であり、成功を示している。なのでユーザー定義の関数の戻り値に勘違いでS_FALSEを返した場合に、呼び出し元でSUCCEEDEDマクロを使ってしまうと成功してしまうので注意。


Visual StudioのIntelliSenseについて

Visual Studioを使ってソフトウェア開発している人には欠かせないであろう、IntelliSense。クラス名の自動補完などを行ってくれるので、その都度クラスのヘッダファイルを見る必要が無く、引数の型も表示してくれる便利な機能。

ところでつい最近、何故かIntelliSenseが反応しなくなってしまった。その時に行った修復方法をメモしておく。


1.一旦、開いてるソリューションを保存しVisual Studioを終了する
2.ソリューションのデータのあるディレクトリに移動する
3.プロジェクト名.ncbというファイルを削除又はリネームする
4.ソリューションを開き、IntelliSenseを使う


ソリューション名.ncbというファイルは、クラス名やメンバ変数、メンバ関数を管理するデータベースファイルである。それを削除することにより、破損していたncbファイルの再構築が行われるので再び利用可能となる。
なお、プログラムに問題があってIntelliSenseが動作しない場合も多いので事前に確認をしておくこと。