「WRL+DirectX」で始めたプロジェクトを「C++/WinRT + DirectX」に移行する方法 - 準備編 -
2023-12-12
azblob://2023/12/12/eyecatch/2023-12-12-preparing-to-migrate-from-wrl-to-winrt-000.png

この記事は、Qiitaに掲載の記事を再編集したものです。

レイチェルです。 

DirectX12の勉強を始めたばかりの時、ネットに転がってる情報が大体 「WRL+DirectX」 で開発をするものばかりでした。 

そんなわけで、自分も例に漏れずWRLのプロジェクトを作成して開発を開始しました。

WRLで開発を行う一番の目的は、ComPtr クラスです。

DirectXのAPIはCOMオブジェクトとして実装されており、WRLではCOMオブジェクトをいい感じに扱う機能が提供されております。 

その1つがCOMオブジェクトのスマートポインタである ComPtr クラスというわけです。

自分はCOMに関しても初見プレイだったので、Microsoftのドキュメントを漁りながら勉強していました。 そんなある日、COM を使用した DirectX のプログラミングというページで以下の記載を見つけました。

C++/WinRT で COM コンポーネントを使用 する」トピックでは、 C++/WinRT を使用して DirectX API (およびすべての COM API) を使用する方法を示します。 これは、最も便利で推奨されるテクノロジです。

ちょっと待った!

C++/WinRTって何!? 

もしかしてWRLってクソ古い!? 

時代はC++/WinRTなんか???

というわけで開発は途中ですが、WRLからWinRTに移行を行うこととなるのでした… 

今回は、その準備段階です。

C++/WinRT のパッケージをインストールしよう!

本記事ではVisual Studio 2022を使用している場合の手順をご紹介いたします。

まずはNugetパッケージを使ってC++/WinRTをプロジェクトにぶち込みます。 

この手順はWRL から C++/WinRT への移行というページが参考になります。

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

次に、[参照] を選択して検索ボックスに Microsoft.Windows.CppWinRT と入力してください。 

すると一番目に目的のパッケージが出てくるのでインストールしてください。

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

ファイルの作成

皆さん プリコンパイル済みヘッダーファイル ってご存知ですか?

僕は知らなかったですはい。 

詳しいことはプリコンパイル済みヘッダー ファイル のページを参照してくださいな。 

本記事では、プリコンパイル済みヘッダーに必要なライブラリをあらかじめ書き込んでおきます。

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

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

プロジェクトの設定

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

[構成プロパティ] → [全般] → [Windows SDK バージョン]10.0.17134.0 以上に設定します。 

Windows10 をお使いの方は 10.0 (最新のインストールされているバージョン) とかでいいと思います。

次に、[構成プロパティ] → [C/C++] → [プリコンパイル済みヘッダー] → [プリコンパイル済みヘッダー]作成 (/Yc)にします。 

また、[プリコンパイル済みヘッダー ファイル]pch.h と入力します。

pch.hの中身を埋める

作成した pch.h によく使いそうなヘッダファイルのインクルードを書いておきます。 

中身は皆様のお好みで構わないと思います。

ただ、唯一必須なのは winrt/base.h のインクルードです。 

また、using winrt::com_ptr を書いておくと com_ptr を使用する際にいちいち winrt:: を書かずに済むためいいかもしれません。

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

C++#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 を使うように改造していきます!

参考文献