Windows Runtime Cpp 導入

提供:yonewiki

Windows Runtime Cppに戻る

概要

Visual Studio C++でのWindows Runtimeの利用方法について記述します。対応しているVisual StudioのバージョンはVisual Studio2012からですかね。おそらくこれ以降のVisualStudioでも開発できるように対応されていると思いますし、やり方はあんまり変わらないと思います。Windows10から始まったUniversal Windows Platform UWPを利用する場合には競合する部分がありますので、使い方に注意が必要です。UWPではUWP APIを使うためWindows10 SDKを利用します。特に初期化処理のあたりで競合しますので、使い分けが必要となる場合があります。UWPにもWindowsRuntimeにも詳しくないので、今のところはなんとなくそんなイメージくらいの思いなので、いろいろわかり次第、更新するかもしれません。

文字コード指定

「ツール」->「オプション」->「構成プロパティ」->「一般」で「文字セット」の欄を編集状態にしたときに表示される「Unicode文字セットを使用する」を選択します。

追加の依存ファイル

Windows RuntimeをVC++で利用するにはライブラリファイルを指定する必要があります。

「ツール」->「オプション」->「構成プロパティ」->「リンカー」->「入力」で「追加の依存ファイル」の欄を編集状態にしたときに表示される「編集」を選択して、以下のライブラリ名の文字列を入力してOKを押します。

runtimeobject.lib

インクルードファイル

以下のヘッダファイルをインクルードする必要があります。

#include <roapi.h>

初期化・後処理 RoInitialize~RoUninitialize

Windows Runtimeを利用する場合は初期化と後処理が必要で、RoInitialize関数で初期化し、RoUninitialize関数で後処理をします。この初期化と後処理を記述した間でWindows Runtime関数を利用することができます。Windows Runtime関数を使ったときに必要となる、各種関数の利用状況把握をはじめとするいろいろな管理をしてくれることになっています。この管理が必要でなくなったときにRoUninitialize関数を実行するというイメージです。例えば、何もしないWindows Runtimeを使うプログラムは以下のようなプログラムになります。WindowsRuntimeはCOMと同じ概念をもっていて引き継がれています。COM系のCoInitialaize/CoInitializeEx~CoUninitialize関数とかOLE系のOleInitialize~OleUninitializeと互換があるとされていますが、思い通りに使えない関数もあるかもしれません。そのあたりは気を付けてください。どちらにしてもOSや配布されているDLLの状態で動作が変わってくることも考慮しなければならないのでユーザ側のこともよく考えないといけないです。上位のものを使えば、古いWindowsユーザを切り捨てることになるし、上位のものでありなが下位のものでも使えるような互換性を維持しながら幅広いユーザを意識したアプリにするという地道さとか、古いシステムしか使わないという方法とか、そういった判断が迫られます。ちなみにRoInitializeはWindows::Foundation::Initialize()という初期化とも対応しています。ちなみにOleInitializeでマルチスレッドを指定することはできません。

#include <roapi.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main(){
setlocale(LC_ALL, "");
HRESULT hr01 = RoInitialize(RO_INIT_MULTITHREADED);

if(FAILED(hr01)){
    wprintf(L"初期化RoInitialize失敗");
}
else{
    wprintf(L"初期化RoInitialize成功");
}

RoUninitialize();
 
_wsystem(L"pause");
}


  • RoInitialize()関数

引数:RO_INIT_MULTITHREADED もしくは RO_INIT_SINGLETHREADEDを指定。roapi.hで定義されているRO_INIT_TYPE列挙子の引数です。RO_INIT_TYPE::RO_INIT_MULTITHREADEDのように名前空間まで含めて指定することもできます。COMを使用するスレッドの種類を定義する引数です。

戻り値:HRESULT型の列挙子です。S_OKが返ってくることになっています。数字が返ってくるだけの構造なので、適当な整数型の変数でも受け取れると思います。

外部から呼び出されるプログラムを書く場合は呼び出し元のアプリのスレッド体系に従うのが普通です。なんでもかんでも初期化すればいいというわけではありません。あしからず。単体アプリなら初期化ですね。


  • RoUninitialize()関数

引数:ありません!

戻り値:もありません。


Windows Runtime Cppに戻る