DirectX トラブルQ&A

■デバッグモードで実行した際に、ログに「D3D9 Helper: Enhanced D3DDebugging disabled; Application was not compiled with D3D_DEBUG_INFO」と表示される。

不明。これでよいのか。。?


■DrawPrimitiveで表示するときに、テクスチャが表示されない。

SetRenderState( D3DRS_LIGHTING, FALSE ) でライティングを無効にすると表示されるようになる。


warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in d3d9.lib(d3d9.dll)
 という警告が発生


Statlic libraryを作成した時に、追加のライブラリにd3d9.libなどのライブラリを追加した場合に発生するようです。
プロジェクト>プロパティ>構成プロパティ>ライブラリアン>追加の依存関係 をすべて削除し、
代わりに#pragma comment(lib, "ライブラリ名")を記述することで解決しました。


■他のプロジェクトを参照するプログラムをコンパイルしたときに、LNK2005のエラーが発生

これは、参照しているプロジェクトとランタイムライブラリが違っている場合に発生するエラーで、
コンパイルするプロジェクトを参照元と同じランタイムライブラリに変更すれば直ります。

プロジェクト>プロパティ>構成プロパティ>C/C++>コード生成>ランタイム ライブラリ


■Relaseバージョンでコンパイルしたときに、C4727のエラーが発生

いつもDebugバージョンでコンパイルしているので、たまにReleaseバージョンへ
コンパイルし直したらエラーが発生しました。

マイクロソフトのページに詳しく載っていましたが、ぶっちゃけよく分からなかったり。
http://msdn2.microsoft.com/ja-jp/library/ms235540(vs.80).aspx

コンパイルオプションを変更する必要があるってことぐらいは分かったので、
以下のようにやって/GLオプションを消したら、エラーがなくなりました。

プロジェクトのプロパティ>構成プロパティ>C/C++>最適化>プログラム全体の最適化 はい → いいえ


■他のPCでプログラムを実行したら d3dx9d_27.dll が見つからないというエラーが発生

どうやらコンパイルしたDirectX9 SDKのバージョンが新しいため、StaticLibraryだったのがDLLへ変更されてしまったようです。

DLLと一緒にプログラムを配布すればよいそうですが(ライセンスの問題が何かあったはず)
面倒なので、バージョンをDirectX 9.0 Update (December 2004)へ戻すことで解決しました。

ちなみに、Debugビルドバージョンと、DirectX 9.0 2005以上はすべてDLL使用なので注意が必要です。
http://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2FDirectX


■IDirectPlay8PeerをReleaseする際にアクセス違反が発生

DirectPlayのテストプログラムを組んでいたら、原因不明のトラブルが発生した。
処理方法は以下のような手順で行った。

WinMain
 ↓
_beginthreadex でAスレッドの作成
 ↓
CloseHandle()を呼出しスレッド・ハンドルを閉じる
 ↓
Aスレッド上で、IDirectPlayPeer8を初期化しHostとして接続に成功。
 ↓
Aスレッドが終了。(自動的に_endthreadexが呼出される)
 ↓
IDirectPlayPeer8の処理をcloseして、Releaseするところで
アクセス違反が発生。

 _endthreadexが呼出される前に、IDirectPlayPeer8をReleaseすると
正常に終了することができた。

 IDirectPlayPeer8の解放処理は1度しか行っていないし、デバッガメモリを確認したところ
アクセス違反のアドレスとは違うし・・・やはりDirectX内部の処理だろうか。。
それともマルチスレッド処理に何か問題があるのかなぁ。

 天をも仰ぐ気持ちでBBXへ掲載してみたが、まだ返答がない。(3/18現在)
IDirectPlay8ThreadPoolを使用してスレッドを管理できるみたいだけど、
ややこしいからいいや〜(+_+)
 とりあえず、_beginthreadexでマルチスレッドを作らずにテストプログラムを組むことにしよう。
こんなところで時間つぶしてもしょうがないし。

 DirectPlayは最新のDirectXからははずされてしまっているらしいので、
(何か問題があったのか・・?)もしかしたらDirectPlayをWinSockへ変更するかも。


戻る