Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

ネイティブの C++ から UWP の API を呼ぶ (C++/WinRT を使って)

$
0
0

C++/WinRT っていうのが追加されてたんですね。知らなかったのですが。

docs.microsoft.com

これを使うと C++/CX とかみたいな魔改造言語じゃなくて C++ で UWP の開発が出来ますし、UWP の API を呼ぶのもお手軽です。

ちょっとやってみましょう。

環境設定

厳密にこれだけが必要という最小要件はちょっと確認できてないのですが私は以下の環境です。

  • Windows 10 October 2018 Update
  • Visual Studio 2017 15.8 (UWP アプリの開発と C++ 開発あたりのチェックが入っていて Windows 10 SDK 全部入り) + C++/WinRT 拡張

多分、C++ 開発機能と最新の Windows 10 SDK と UWP 開発があれば行けると思います。

やってみよう

以下のプロジェクトを作成します。

  • Windows アプリケーション パッケージングプロジェクト
  • MFC アプリケーション(デフォルトで作成)

Windows アプリケーションパッケージングプロジェクトの下にアプリケーションというノードがあるので、そこに MFC アプリを追加しましょう。

MFC アプリケーションの設定をします。プロパティの中の C/C++ -> Language -> C++ Language Standardの値を ISO C++ 17 Standard (/std:c++17)にします。同じページの Conformance modeNoにします。(上から二番目)

f:id:okazuki:20181016144145p:plain

書いてて気づいたのですが諸事情で英語にしてましたが…、気にせずいきましょう。

続いて Linker -> Input -> Additional Dependencieswindowsapp.libを追加します。

あとは stdafx.hあたりによく使う以下のヘッダーを追加して

#include "winrt/base.h"#include <winrt/Windows.Foundation.h>

そして、適当なところで UWP の API を呼ぶだけです。

// 上らへんで#include <winrt/Windows.UI.Notifications.h>#include <winrt/Windows.Data.Xml.Dom.h>usingnamespace winrt;
usingnamespace Windows::Foundation;
usingnamespace Windows::UI::Notifications;

// 処理の中身auto notificationManager = ToastNotificationManager::GetDefault();
auto toastXml = ToastNotificationManager::GetTemplateContent(ToastTemplateType::ToastText01);
auto textNode = toastXml.GetElementsByTagName(L"text").Item(0);
textNode.AppendChild(toastXml.CreateTextNode(L"Hello from Native dll function!"));
auto toast = ToastNotification(toastXml);
toast.ExpirationTime(winrt::clock::now() + std::chrono::hours() * 2);
notificationManager.CreateToastNotifier().Show(toast);

Windows アプリケーションパッケージングプロジェクトをスタートアッププロジェクトにして実行するとトーストが出ると思います。 凄い!ちゃんと C++ だ!!


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>