BT

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

| 作者: Jonathan Allen フォローする 614 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2012年11月1日. 推定読書時間: 4 分 |

原文(投稿日: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 アプリケーションではいずれもサポートされない予定である。

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT