SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C++/CX: Windows Runtime Componentをつくる

  • このエントリーをはてなブックマークに追加

 .NETの大きなウリの一つが多言語対応です。定められたお作法に則ったコードを書けば、他の言語で書かれたものと自由に混ぜてアプリケーションが作れます。C++/CXはストアアプリの実行環境であるWindows Runtimeの"お作法"に従うよう拡張されたC++てわけ。前回で書いたC++のコードにC++/CXのカワを被せ、C#やVB.NETから呼び出すココロミを紹介します。

  • このエントリーをはてなブックマークに追加

step5:薄皮を被せる

 前回こしらえたC++によるCounterLibに、C++/CXの皮を被せてWindows Runtime Componentを作ってみます。"プロジェクトの追加"で選択するのはもちろん"Windowsランタイムコンポーネント"です。名前はCounterComponentとしましょう。

 ひな型ができたら、プロジェクトプロパティでCounterLibのヘッダ/ライブラリの在り処とライブラリ名(CounterLib.lib)を設定します。

 ひな型のClass1.h/Class1.cppをそれぞれCounter.h/Counter.cppに改名し、ぺらっぺらの薄皮を作ります。

Counter.h
#pragma once

#include "CounterLib/CounterLib.h"

namespace CounterComponent {

//    [Windows::Foundation::Metadata::WebHostHidden]
    public ref class Counter sealed {
    public:
        Counter();
        void Increment();
        void Decrement();
        int  Get();
    private:
        CounterLib::Counter counter_;
    };

}

 Windows Runtime Componentが従うべきお作法(ルール)がいくつかあります。

  • ヨソ様に使ってもらうつもりならpublicでなくてはならない。
    これはまぁ当然のこととして。
  • publicなものは直接/間接的に(プロジェクト名と同じ)名前空間に置かなければならない。
    おっと、プロジェクト名がそのまま名前空間になりますか。これは要注意。
  • public ref classはsealed、すなわち継承不可でなくてはならない。
    ふむ...コンポーネントから導出することを許しちゃならん、と。
  • public部にC/C++由来のものがあってはならない。
    例えばポインタとか、ヘッダの必要なstd::stringとかをpublic部つまりヨソ様がお使いになるインターフェースに置いてはならん。
    そりゃそうです。継承できないんだからprotected部は無意味になりますね。private部はヨソ様には見えない/触れないのでポインタだろがstd::stringだろがなんでも置いておけます(現にCounterLib::Counterがprivate部にあります)。

 主要なお作法はざっとこんなもんでしょうか。これらを満足していないとコンパイル時にエラーです。

 実装部はまさに薄皮。各メソッドが呼ばれたら内包するCounterLib::Counterに横流ししているだけ。

Counter.cpp
#include "pch.h"
#include "Counter.h"

using namespace Platform;

namespace CounterComponent {

    Counter::Counter() : counter_() {}
    void Counter::Increment() { counter_.increment();  }
    void Counter::Decrement() { counter_.decrement();  }
    int  Counter::Get()       { return counter_.get(); }

}

 ビルドするとCounterComponent.dllとCounterComponent.winmdが作られます。.dllがコンポーネント本体。.winmdはメタデータと呼ばれ、.dllの使い方(インターフェース)が記された"トリセツ"的役割を担います(C/C++でいうところのヘッダみたいなものです)。各国語で書かれたトリセツあるじゃないですか、あんなカンジ。このトリセツはC#やVB.NETなど、さまざまな言語から読むことができるわけです。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7541 2013/12/26 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング