「WRL+DirectX」で始めたプロジェクトを「C++/WinRT + DirectX」に移行する方法 - 準備編 -

レイチェルです。
DirectX12の勉強を始めたばかりの時、ネットに転がってる情報が大体 **「WRL+DirectX」** で開発をするものばかりでした。
そんなわけで、自分も例に漏れずWRLのプロジェクトを作成して開発を開始しました。

WRLで開発を行う一番の目的は、`ComPtr` クラスです。
DirectXのAPIはCOMオブジェクトとして実装されており、WRLではCOMオブジェクトをいい感じに扱う機能が提供されております。
その1つがCOMオブジェクトのスマートポインタである`ComPtr`クラスというわけです。

自分はCOMに関しても初見プレイだったので、Microsoftのドキュメントを漁りながら勉強していました。
そんなある日、[COM を使用した DirectX のプログラミング](https://learn.microsoft.com/ja-jp/windows/win32/prog-dx-with-com)というページで以下の記載を見つけました。

> 「 [C++/WinRT で COM コンポーネントを使用 する](https://learn.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/consume-com)」トピックでは、 [C++/WinRT](https://learn.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/) を使用して DirectX API (およびすべての COM API) を使用する方法を示します。 これは、最も便利で推奨されるテクノロジです。

**ちょっと待った！C++/WinRTって何！？**
**もしかしてWRLってクソ古い！？**
**時代はC++/WinRTなんか？？？**

というわけで開発は途中ですが、**WRL**から**WinRT**に移行を行うこととなるのでした…
今回は、その準備段階です。

# C++/WinRT のパッケージをインストールしよう！
本記事ではVisual Studio 2022を使用している場合の手順をご紹介いたします。

まずは`Nugetパッケージ`を使って`C++/WinRT`をプロジェクトにぶち込みます。
この手順は[WRL から C++/WinRT への移行](https://learn.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/move-to-winrt-from-wrl)というページが参考になります。

**[プロジェクト] → [NuGet パッケージの管理(N)...]** の順に選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/6cc69285-9e17-9068-c019-3b1eb5b2da1b.png)

次に、**[参照]** を選択して検索ボックスに `Microsoft.Windows.CppWinRT` と入力してください。
すると一番目に目的のパッケージが出てくるのでインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/c7d63556-ed56-47a2-a780-59506768bbea.png)

# プリコンパイル済みヘッダーファイルを用意しよう
## ファイルの作成

皆さん **プリコンパイル済みヘッダーファイル** ってご存知ですか？
僕は知らなかったですはい。
詳しいことは[プリコンパイル済みヘッダー ファイル](https://learn.microsoft.com/ja-jp/cpp/build/creating-precompiled-header-files?view=msvc-170) のページを参照してくださいな。
本記事では、プリコンパイル済みヘッダーに必要なライブラリをあらかじめ書き込んでおきます。

まずはプロジェクト直下でいいので **[追加(D)] → [新しい項目(W)...]** と進んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/1f813f7f-d868-188c-8d7b-1e83417498fa.png)

**[ヘッダーファイル(.h)]** を選択します。名前は一般的に`pch.h`がよく用いられるみたいなので、ここでもそうします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/e4b1bea0-2472-0bff-b640-bcf43b17b451.png)

## プロジェクトの設定

**[プロジェクト(P)] → [`プロジェクト名` のプロパティ(P)]** と進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/60962dad-be8d-c75a-91cf-d4d52ac8d4bc.png)

**[構成プロパティ] → [全般] → [Windows SDK バージョン]** を `10.0.17134.0` 以上に設定します。
Windows10 をお使いの方は `10.0 (最新のインストールされているバージョン)` とかでいいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/58a1f7fa-35b3-e141-d8c7-5cb869abf4b0.png)

次に、**[構成プロパティ] → [C/C++] → [プリコンパイル済みヘッダー] → [プリコンパイル済みヘッダー]** を`作成 (/Yc)`にします。
また、**[プリコンパイル済みヘッダー ファイル]** に `pch.h` と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/2a539623-a4dc-4a1b-1507-7d5522aae381.png)


## pch.hの中身を埋める

作成した`pch.h`によく使いそうなヘッダファイルのインクルードを書いておきます。
中身は皆様のお好みで構わないと思います。
ただ、唯一必須なのは `winrt/base.h` のインクルードです。
また、`using winrt::com_ptr` を書いておくと `com_ptr` を使用する際にいちいち `winrt::` を書かずに済むためいいかもしれません。

以下は、僕の今現在のpch.hの中身です。

```
#pragma once

#include "targetver.h"

#include <windows.h>

#include <Unknwn.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <winrt/base.h>

#include <d3d12.h>
#include <DirectXMath.h>
#include <D3Dcompiler.h>
#include <dxgi1_4.h>

using winrt::com_ptr;
using namespace DirectX;

```

# 次回予告
次回は、元々`WRL`の`ComPtr`を使用していたプログラムを `winrt::com_ptr`を使うように改造していきます！

# 参考文献
- [COM を使用した DirectX のプログラミング - Win32 apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/win32/prog-dx-with-com)
- [WRL から C++/WinRT への移行 - UWP applications | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/move-to-winrt-from-wrl)