Visual C++ 2015でWindows 10向けSDKのもと、C++/CXを有効にしてWinRT APIを使う方法を調べました。
Visual C++ 2013までと異なり、Visual Studioのプロジェクトのプロパティですべて設定できるようになりました。次の各項目を設定していきます。
- ターゲットプラットフォームバージョン
- デフォルトだと8.1になっているので、10.0.10240.0にします。
- コンパイルオプション/ZWの有効化
- 「Windowsランタイム拡張機能の使用」を「はい (/ZW)」にします。
- 最小リビルドの無効化
- /ZWと併用できないため無効化します。Debugのみです。
- ライブラリパスの設定
- 「構成プロパティ」→「C/C++」→「全般」の「追加の#usingディレクトリ」に次の2つを追加します。「VC++ディレクトリ」のほうだとダメでした。
- $(VCInstallDir)lib\store\references
- $(WindowsSdkDir)UnionMetadata
なお、それぞれのディレクトリの実際の場所は次のようになります。- C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\store\references
- C:\Program Files (x86)\Windows Kits\10\UnionMetadata
以上で設定は完了です。
なお、ターゲットプラットフォームバージョンで10.0.10240.0を選択できるようにするには、Visual Studio 2015のインストール時にオプションを選択しておく必要があります。「Windows開発とWeb開発」→「ユニバーサルWindowsアプリ開発ツール」→「ツールおよびWindows SDK 10.0.10240」です。これがないと、8.1しか選べないので注意してください。
プロジェクトの設定が終わったら、こんな風にC++/CXでWinRT APIを使ったコードがコンパイル・実行できるようになります。
#include "stdafx.h" #include <iostream> #include <collection.h> #include <ppltasks.h> template<typename Tr> std::basic_ostream<wchar_t, Tr>& operator<<( std::basic_ostream<wchar_t, Tr>& os, Platform::String^ s) { return os << s->Data(); } using namespace Platform; [MTAThread] int main() { std::wcout.imbue(std::locale("")); using namespace concurrency; using namespace Windows::Foundation; using namespace Windows::Web::Http; try { auto httpClient = ref new HttpClient; auto resTask = create_task(httpClient->GetAsync( ref new Uri("http://www.yahoo.co.jp/"))); auto res = resTask.get(); std::wcout << static_cast<int>(res->StatusCode) << std::endl; } catch (Exception^ e) { std::wcout << e->ToString() << std::endl; return e->HResult; } } |
なお、このプログラムはWindows 8.1で実行できることを確認しました。Windows 10にもそれ以前にも存在するAPIなら、そのまま以前のバージョンのWindowsでも動くようです。
以上、Visual C++ 2015でデスクトップアプリからC++/CXとWinRT APIを使えるようにする話でした。
スポンサード リンク |