Help us understand the problem. What is going on with this article?

Visual Studio2015でDirectX9の環境を構築する

新しいPCを購入してVisual Studio 2015をインストールしたところ
昔DirectX9を使って作ったソリューションをビルドしたらエラーになりました。
というわけでVisual Studio 2015でDirectX9を動作させるための環境設定について覚書。

事前準備

  • Visual Studio 2015をインストールしている。
  • DirectX SDK (June 2010)をインストールしている。
  • Visual Studio 2015で新しくWin32プロジェクトを作っている。(下記に手順記載)
    • VS2015を起動 → 新しいプロジェクト → Visual C++ → Win32プロジェクトを選ぶ
    • アプリケーションの種類 → Windows アプリケーション
    • 追加のオプション → 空のプロジェクトにチェック
    • Security Development Lifecycle(SDL)にチェック

とりあえず最低限のコード書いて動作確認

sample.cpp
#include <windows.h>

///*--------------------------------------------
//メイン
//---------------------------------------------*/
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
{
    return 0;
}

何もしてないので、ビルドは通る。
ここでビルドがうまくいかない場合はそもそも何かおかしい。

DirectX9のヘッダとかライブラリを読み込む

sample.cpp
#include <windows.h>
#include <d3dx9.h>
#include <dxerr.h>

#pragma comment( lib, "d3d9.lib" )
#if defined(DEBUG) || defined(_DEBUG)
#pragma comment( lib, "d3dx9d.lib" )
#else
#pragma comment( lib, "d3dx9.lib" )
#endif
#pragma comment( lib, "dxerr.lib" )

///*--------------------------------------------
//メイン
//---------------------------------------------*/
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
{
    return 0;
}

何も設定してないのでヘッダが読み込めないとか、リンクエラーとかが出る。

プロジェクトのプロパティを開き、構成プロパティのVC++ ディレクトリを選択
インクルードディレクトリに$(DXSDK_DIR)Include;を追加
ライブラリディレクトリに$(DXSDK_DIR)Lib\x86;を追加

これでビルドは通る。
ここでビルドが通らない場合はSDKのインストールがうまくいってないかも。

DxErr.hの機能を使おうとするとリンクエラー

いつも通り設定して普通にビルド通り、問題なしと思いきや
ログ出力マクロの「DXTRACE_ERR」を使った瞬間リンクエラーが出ました。

エラー LNK2019 未解決の外部シンボル __vsnwprintf が関数 "long __stdcall StringVPrintfWorkerW(unsigned short *,unsigned int,unsigned int *,unsigned short const *,char *)" (?StringVPrintfWorkerW@@YGJPAGIPAIPBGPAD@Z) で参照されました。

__vsnwprintf関数がないとのことだが
VS2015から、上記関数は別のライブラリに移動されたようです。

プロジェクトのプロパティを開き、 構成プロパティのリンカー → 入力 を選択
追加の依存ファイルにlegacy_stdio_definitions.libを追加してあげて解決。

と、ここまでやってひとまずは動きそうな感じでした。
(少なくとも新規プロジェクト作成でやった場合は)

過去にDirectX9で作られたソリューションを動かす場合

VS2015でVS2010などの古いソリューションを開くと
最初にプロジェクトの形式が古いのでアップコンバートする確認が出ると思うのでOKします。

あとは上記に記載したプロジェクトと同様にインクルードディレクトリの設定を見直し。
リンカー → 入力 に 追加の依存ファイルlegacy_stdio_definitions.libの追加をすればある程度動くかと。

動かない場合は、今回作成したプロジェクトと
当時のプロジェクトの差分を見て足りないものを追加していくとよさそうです。
(VC++ ディレクトリのインクルードディレクトリに違いがないかなど)

おまけ

DirectXの機能はWindows VistaからWindowsの標準SDKに含まれたため
今回のようにDirectX SDKを別途インストールして使用する場合に下記の警告が多発することがあると思います。

c:\program files (x86)\microsoft directx sdk (june 2010)\include\dxgitype.h(12): warning C4005: 'DXGI_STATUS_OCCLUDED': マクロが再定義されました。

この警告がうっとおしい場合は下記のように、一時的にC4005の警告を無視するなどがよさそうです。
(根本的なことを言えばDirectX9とか前時代的なものを使うなというところなのでしょうが)

sample.cpp
#pragma warning(push)
#pragma warning(disable:4005)
#include <d3dx9.h>
#pragma warning(pop)

おわり

今後はDirectX SDKを使わなくなり、これらの情報も無意味になるのかもしれませんが
昔のプログラムを動かしたいという場合はここらへん注意してみればいいと思います。

Nekonecode
◆将来の夢 プログラムの先生 ◆経歴 Web屋→ゲーム屋→フリー→正社員+フリー
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした