mrubyというオープンソースの組み込み用プログラミング言語コアを組み込んだWindowsランタイム・コンポーネントをC++/CXを使って実際に作ってみよう。
powered by Insider.NET
前回は、既存のC/C++ライブラリをWindowsランタイム・コンポーネント化する際に取れる戦略と、それらの特徴、メリット/デメリットなどについて検討した。連載第2回ではmrubyをコンパイルしたが、今回は、そのmrubyを組み込んだWindowsランタイム・コンポーネントをC++/CXを使って実際に作ってみよう。
ここでは、前回に説明したmrubyを組み込んだファサード・パターンのコンポーネントとする。なお、完全なソース・ファイルは、https://github.com/arton/MrbFacadeにある*1。
*1 プロジェクト・ファイルに設定してあるmrubyのincludeディレクトリおよびlibディレクトリはダミーなので環境に合わせて修正する必要がある(これらの設定には、ソリューション・エクスプローラでプロジェクト名を右クリックして[プロパティ]を選択し、[C/C++]−[全般]もしくは[リンカー]−[全般]からアクセスできる。後述)。
C++/CXでWindowsランタイム・コンポーネントを作成するには、Visual Studio 2012のメニューバーから[ファイル]−[新規作成]−[プロジェクト]を選択して、[新しいプロジェクト]ダイアログで[Visual C++]−[Windows ストア]−[Windows ランタイム コンポーネント]を選択する(以下の画面を参照)。ここでは、mrubyのファサード(facade)とするので、プロジェクト名に「MrbFacade」と入力している。
プロジェクトを作成すると、ソリューション・エクスプローラには、以下のテンプレートが用意された状態となる。
このプロジェクトには以下のような.cpp/.hファイルが含まれている。
また、外部依存関係として、次の2つの.winmdファイルがあらかじめ組み込まれている。
このように、生成されるテンプレート・ファイルについては、外部依存関係の既定の設定を除けば一見するとWindowsランタイム・コンポーネントだからといって特に変わった点はない。
Windowsランタイム・コンポーネント・プロジェクトの重要な設定は、コンパイル・オプションにある(以下の画面を参照)。
上の画面を見ると、CLRの利用に関する[共通言語ランタイム サポート]が空欄(=利用しない)となっている代わりに、[Windowsランタイム拡張機能の使用]が[はい(/ZW)]となっていることが分かる。
/ZWオプションによってWindowsランタイム言語拡張機能が有効となり(つまり、C++/CXを指定したことになり)、Windowsストア・アプリで利用できないランタイム関数の呼び出しはコンパイル時に検出されてエラーとなる。また、/ZWを設定すると、CLRは利用できなくなる。
なお、オプションについては、MSDNサイトの「コンパイラとリンカーのオプション (C++/CX)」で解説されている。また、Debugビルドでは、/RTC1(MSDNサイトの「/RTC (ランタイム エラー チェック)」を参照)によってランタイムエラー・チェックが有効になるが、このオプションを設定して生成したプログラムはWindowsストア・アプリの審査を通らないことには注意してほしい。Windowsストア・アプリをリリースする場合は、必ずReleaseビルドが必要である。
それ以外の点については、通常のVisual C++のプロジェクトと同様に考えてよい。従って、mrubyをライブラリとして利用する場合は、標準的な方法、つまりmruby関連のヘッダ・ファイルを取り込むためのインクルード・ディレクトリを設定し、mrubyのライブラリ・ファイルを入力ライブラリとして設定する。
以下で行う設定は、Debug、Releaseのいずれのビルドでも必要となるため、設定漏れを避けるために、あらかじめプロパティ・ページの[構成]を[すべての構成]にしておくことが望ましい。
なお、以下で参照するmrubyディレクトリは、第2回でmrubyをコンパイルしたときにソース・ファイルを展開したディレクトリである。読者が自分でmrubyをコンパイルしているときには「mruby\include」ディレクトリなどは対応するディレクトリに適宜読み替えてほしい。
また、mrubyのヘッダ・ファイルで構造体のレイアウトに影響するため、「DISABLE_STDIO」をプロジェクトのプロパティ・ページから[C/C++]―[プリプロセッサ]の[プリプロセッサの定義]に追加する。
プロジェクトの構成ができたら、次にMrbFacadeで実装するAPIについて検討してみよう。
Copyright© Digital Advantage Corp. All Rights Reserved.