BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 既存の C++ コードを Windows 8/Windows Phone 8 に移植する

既存の C++ コードを Windows 8/Windows Phone 8 に移植する

ブックマーク

原文(投稿日:2012/10/30)へのリンク

 

C++ アプリケーションを Windows 8/Windows Phone 8 に移植するとき,まず考慮しなければならないのはユーザインターフェースである。Windows 8 の求めるタッチ指向の UI に適したユーザインターフェースを備えたアプリケーションは皆無か,あったとしても非常に数少ないからだ。UI 層の開発には4つの選択肢がある。

  • DirectX を使用して C++ で実装
  • XAML を使用して C++ で実装
  • XAML を使用して .NET で実装
  • Windows RT 上で HTML5 を使用して実装

UI の移植は事実上の書き換えになるが,それぞれの技術に関する説明はこの記事で扱う範囲を越えている。

Win32 あるいは COM API は大部分が使用できない。その他のものにも制限があるため,使用したい API が仮にあったとしても,以前と同じことを行うのは必然的に不可能になる。API にこのような制限が課されたのは,セキュリティ上の理由に加えて,バッテリ寿命に悪影響を及ぼしたり,新しいアプリケーションライフサイクルモデルに適さなかったりするためだ。GDI サブシステムに至っては,すべてが使用禁止になっている。

従来の COM とは異なり,アプリケーション間の通信手順を独自に定義することはできない。ソケットの使用も制限され,ローカルポートを listen することも不可能になった。このような制限の背景にあるのは WinRT アプリケーション同士を完全に分離する,という基本概念だ。これによって,複数のアプリケーションをセットとして一度にインストールすることはできなくなる。

使用不可能になった API を確認する目的で,コンパイル時にエラーを発生させる WINAPI_FAMILY_PARTITON マクロが用意されている。これは多少の苛立たしさを覚える作業になるかも知れない。というのは,削除された構造体に関するメッセージのせいで,その構造体を使用する禁止 API の呼び出しに気付くのが遅れる可能性があるからだ。

Microsoft の Tarek Madkour 氏は既存のライブラリを移植する開発者に対して,マクロではなく Windows Application Certification Kit を使用するように勧めている。これを行うには,移植対象のライブラリをすべて参照する XAML ベースのアプリケーションを新たに作成した上で,それを一度実行してコンピュータに配置する必要がある。その後で Certification Kit をアプリケーションに対して実行すれば,変更あるいは削除が必要な API コールの一覧が生成される仕組みだ。

この分野に関連するリソースとしては,他にも Windows Store アプリのための Windows API 代替機能 のリストが提供されている。

スレッディング

従来の CreateThread API コールは WinRT ではサポートされない。一般的にその役割を果たすのは WInRT Thread Pool サーバだが,標準的な Windows アプリケーションでサポートされないという大きな欠点がある。以降に紹介する他の方法については,そのような制限はない。

よりレベルの高い抽象化を求めるならば,Parallel Patterns Library Tasks がこれに代わる選択肢になる。

低レベルのアクセスとしては,ISO C++ の std::threadstd::future が使用可能だ。より広い意味で言えば,Microsoft はすべてのデバイスとオペレーションシステムで標準 C++ をサポートする意向である。

最も低レベルのオプションは,VC++ ランタイムの _beginthread 関数だ。ただし Tarek の説明では,これが "いちばんハマりやすい" 方法とされている。注記: Microsoft がプレゼンテーションした内容に反して,上記のリンク先にはこの API がサポートされていないという記述がある。

非同期

C# や VB の場合と同じように,Windows 8 をターゲットとする C++ 開発者も,新しい非同期パターンや ラムダ式 の構文には習熟する必要がある。

ライブラリの公開

ほとんどのライブラリは通常の C++ で記述可能だが,他言語に対して公開する必要があるものについては,C++/CX を使用して WinRT コンポーネントとして公開しなければならない。ただしパフォーマンスの面では通常の C++ リンクよりも遅くなるので,ライブラリの参照先が C++ アプリケーションの場合は使用しない方がよいだろう。

C と C++/CLI は,WinRT アプリケーションではいずれもサポートされない予定である。

 

この記事に星をつける

おすすめ度
スタイル

BT