次の方法で共有


Bing Maps Trip Optimizer のサンプルでの既存のコードの移行

このドキュメントでは、Bing マップ トリップ オプティマイザーの ActiveX バージョンから Windows ストア アプリに移行したときに準拠した主要なガイドラインの一部をまとめています。 このドキュメントでは、既存のコードを Windows ランタイム に移行する方法については詳細に説明しません。 むしろ、経験上の事柄および注意事項を説明しています。

注意

このドキュメントに対応するサンプル コードは、「Bing Maps trip optimizer sample (Bing マップ トリップ オプティマイザー サンプル)」(Windows ストア アプリ) および「Bing Maps Trip Optimizer (Bing マップ トリップ オプティマイザー)」(ActiveX Web アプリ) にあります。

この記事の内容

  • JavaScript 移行キー ポイント

  • C++ 移行キー ポイント

  • Interop 移行キー ポイント

JavaScript 移行キー ポイント

Bing マップ トリップ オプティマイザーの ActiveX バージョンは UI として 1 つのコード ファイル、つまり OptimizerControl.htm を使用します。 このドキュメントで説明されているように、Windows ランタイム を使用するために移行したとき、Web と対話するコンポーネントと Windows ランタイム と対話するコンポーネントについて個別のコンテキストを作成する必要がありました。 また、コンテキストが通信できるように追加のコードを記述する必要がありました。 ドキュメント「Features and restrictions by context」は、ローカル コンテキストと Web コンテキストの違いについて説明しています。

Windows ストア アプリケーション バージョンの元のバージョンのコードの大半を使用できました。 1 つの大きな違いは、Windows ストア アプリケーションが ActiveX コントロールを参照しなくなったため、object 要素を C++ コンポーネントを表すグローバル変数に置き換えました。 この機能は「Bing Maps Trip Optimizer のサンプルでの JavaScript と C++ 間の相互運用」で詳しく説明します。

alertpromptopen などのウィンドウ メソッドは、JavaScript Windows ストア アプリでは機能しません。 コントロールの ActiveX バージョンは、alert を使用して、25 か所を超える場所が入力された場合などの問題をユーザーに通知します。 アプリの Windows ストア バージョンでは、Windows.UI.Popups.MessageDialog クラスを使用してユーザーにメッセージを表示します。

// Show message dialog.            
new Windows.UI.Popups.MessageDialog(data.message).showAsync().then();

メッセージ ダイアログが表示された後で実行する操作がないため、then ステートメントは空です。 JavaScript の非同期操作を使用する方法の詳細については、「Asynchronous programming」を参照してください。

JavaScript Windows ストア アプリの既存の HTML 機能の使用方法の相違点については、「HTML, CSS, and JavaScript features and differences」を参照してください。

アプリケーションの ActiveX バージョンでは、UI にマップを表示するために、Bing マップ AJAX コントロール、Version 6.3 を使用しています。 Windows ストア アプリ バージョンでは、Bing マップ AJAX コントロール、Version 7.0 を使用します。 Version 6.3 から Version 7.0 へのアップグレードは必須ではありません。Windows ストア アプリケーションで Version 6.3 を使用できます。 この実装に Version 7.0 を選択したのは、タッチのパフォーマンスとサポートが向上されていること、および Bing マップから情報を取得する新しい方法を示すためでした。

[このページのトップへ]

C++ 移行キー ポイント

Windows ストア コンポーネントの作成に C++/CX を使用する場合、コンパイラと Windows ランタイムは、他のコンポーネントおよび言語と相互運用するために必要なインフラストラクチャを処理します。 コントロールの ActiveX バージョンを Windows ストア コンポーネントに移行したとき、カスタム COM インターフェイスを実装するために必要なインフラストラクチャ コードを削除できました。 たとえば、Windows ランタイム コンポーネントは、インターフェイスを定義する IDL ファイル、およびコンポーネントが提供するイベントを必要としません。 加えて、純粋なネイティブ コードを使用する実装の詳細を可能な限り保持しました。 C++/CX と Windows ランタイム の使用は、コントロールが Windows ランタイム の他のオブジェクトおよびコンポーネントとやり取りする場合にのみ必要です。

Windows ランタイム を使用するコントロールに ActiveX コントロールを移行する際、次のガイドラインを考慮に入れてください。

ヒント

これらのガイドラインの多くは、C++/CX 構文の使用に関係しています。この構文の詳細については、「Visual C++ の言語リファレンス (C++/CX)」を参照してください。

  • Visual Studio プロジェクトの作成には WinRT クラス ライブラリ テンプレートを使用します。

  • ActiveX コントロールから Windows ランタイム クラスにパブリック インターフェイスのメソッドとプロパティを追加します。 Windows ランタイム と互換性のある型を使用するために、パラメーターと戻り値の型を変換します。 たとえば、TripOptimizerImpl.idl は、ActiveX コントロールの IOptimizerControl インターフェイスを定義します。

    interface IOptimizerControl : IDispatch{
       [id(1)] HRESULT OptimizeTripAsync([in] VARIANT* waypoints, [in] BSTR travelMode, 
          [in] BSTR optmz, [in] BSTR bingMapsKey,
          [in] DOUBLE alpha, [in] DOUBLE beta, [in] DOUBLE rho, [in] ULONG iterations,
          [in] VARIANT_BOOL parallel);
       [id(2)] HRESULT CancelAsync();
    };
    

    Windows ストア コンポーネントでは、Windows ランタイム コンポーネントの TripOptimizer::OptimizeTripAsync メソッドの宣言は次のとおりです。 HRESULT ではなく、実際の戻り値の型 Windows::Foundation::Collections::IMap<K, V> を使用します。 また、各パラメーターに Windows ランタイム の適切な型も使用します。

    注意

    この実装では CancelAsync メソッドを削除できました。キャンセルの機能が Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>::Cancel メソッドによって提供されるためです。

    // Optimizes a trip as an asynchronous process.
    Windows::Foundation::IAsyncOperationWithProgress<
        Windows::Foundation::Collections::IMap<
            Platform::String^, 
            Windows::Foundation::Collections::IVector<Platform::String^>^>^, 
        Platform::String^>^ OptimizeTripAsync(
            Windows::Foundation::Collections::IVector<Platform::String^>^ waypoints, 
            Platform::String^ travelMode, 
            Platform::String^ optimize,
            Platform::String^ bingMapsKey, 
            double alpha, double beta, double rho,
            unsigned int iterations, bool parallel);
    

    TripOptimizer::OptimizeTripAsync メソッドは「TripOptimizer と TripOptimizerImpl クラスの作成」セクションで詳しく説明されています。

  • ActiveX コントロールから Windows ランタイム クラスにパブリック インターフェイスのイベントを追加します。 メソッドやプロパティと同様に、Windows ランタイム と互換性のある型を使用するために、パラメーターと戻り値の型を変換します。

    この実装では、ActiveX バージョンで定義されたイベントをすべて削除できました。これらの操作がすべて他の方法で処理されるからです。 たとえば、TripOptimizer::OptimizeRouteAsync によって返される IAsyncOperationWithProgress<TResult, TProgress> オブジェクトの一部として結果を直接返すため、完了イベントを定義する必要はありません。 エラーおよび進行状況のコールバックも、IAsyncOperationWithProgress<TResult, TProgress> オブジェクトによって処理されます。 アプリケーションの JavaScript の部分が非同期操作を使用する方法については、「Bing Maps Trip Optimizer のサンプルでの JavaScript と C++ 間の相互運用」を参照してください。

  • Windows ランタイム クラスのデータ メンバーを定義するとき、適切な標準 C++ および Windows ランタイム タイプを選択します。

    たとえば、COptimizerControl クラスは、文字列の値を保持するために _bstr_t などの COM 型を使用します。

    アプリの Windows ストア バージョンでは、文字列の値を保持するために C++ の標準文字列型である std::wstring を使用しました。 たとえば、TripOptimizerImpl::OptimizeTripAsync メソッドでは Windows::Foundation::Collections::IVector<T> パラメーターと Platform::String パラメーターを std::vectorstd::wstring に変換します。これらの変数は Windows ランタイム コンポーネントに渡されないためです。

    // Copy inputs to a OptimizeTripParams structure.
    auto params = make_shared<OptimizeTripParams>();
    for (auto waypoint : waypoints)
    {
        params->Waypoints.push_back(waypoint->Data());
    }
    params->TravelMode = wstring(travelMode->Data());
    params->Optimize = wstring(optimize->Data());
    params->BingMapsKey = UriEncode(bingMapsKey->Data());
    params->Alpha = alpha;
    params->Beta = beta;
    params->Rho = rho;
    params->Iterations = iterations;
    params->Parallel = parallel;
    

    この規則を使用すると、Windows ランタイム に使用される変数をより明確に識別できます。 Windows ランタイム の文字列とコレクションの型 (Windows::Foundation::Collections::IMap<K, V>Windows::Foundation::Collections::IVector<T> など) は、Windows ランタイム とコードとの間で定期的に通信する場合に便利です。アプリが行う必要のある文字列型変換の数を減らせるためです。 または、std::mapstd::vector などの標準 C++ コレクション型の使用を検討できます。

    コントロールの実装の詳細は、「構成のワークフロー」セクションで詳しく説明されています。

  • Windows::Foundation::IAsyncActionWindows::Foundation::IAsyncActionWithProgress<TProgress>Windows::Foundation::IAsyncOperation<TResult>、または Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress> インターフェイスを使用して、非同期メソッドを定義できます。 concurrency::create_async 関数は、C++ Windows ストア アプリまたはコンポーネントからこれらのオブジェクトを作成するための推奨される方法です。

  • 可能な限り既存のコードを使用します。 コードの変更をほとんど行うことなく、アリの巣の最適化アルゴリズムなどの実装の詳細を移行することができました。 ただし、Windows ストア アプリは Win32 および COM API のサブセットを使用できるため、一部のコンポーネントでは代替機能を使用する必要がありました。 たとえば、コントロールの ActiveX バージョンでは、IXMLHTTPRequest を使用して HTTP サーバーと通信します。 C++ コンポーネントでは、IXMLHTTPRequest2 を使用します。これは、Windows ストア アプリで HTTP サーバーと通信するための推奨される方法です。 Bing マップからの XML 応答を処理するために、ActiveX コントロールでは XmlLite を使用します。 Windows ストア コンポーネントでは、Windows ランタイム XmlDocument クラスを使用しますが、その理由として、便利であること、また既存の COM コードを更新して Windows ランタイム 型を使用する方法を示すことがあります。 ただし、Windows ストア アプリで使用できる既存の Win32 または COM コードがある場合は、それを引き続き使用できます。

    Windows ストア アプリでの Win32 および COM の使用方法の詳細については、「Win32 and COM for Windows Store apps (Windows ストア アプリの Win32 および COM)」を参照してください。

    重要

    Windows ストア アプリで Win32 および COM を使用する場合、開発環境で動作しても Windows ストアから配布用に承認されない場合があります。そのため、アプリケーション検証ツールを頻繁に実行して、アプリケーションが検証を渡すことを確認することをお勧めします。詳細については、「アプリの提出」および「方法: パッケージのインストール、検証、およびアップロードを行う」を参照してください。

  • Visual C++ プロジェクトでは、プリコンパイル済みヘッダーの情報を保持するために pch.h と pch.cpp を使用します。 関連する #include ステートメントを stdafx.h から pch.h に移行します。

[このページのトップへ]

Interop 移行キー ポイント

Bing マップ トリップ オプティマイザーの Windows ストア アプリケーション バージョンでは、JavaScript コードの大半を ActiveX バージョンから使用することができました。 主な違いは、HTML コードおよび JavaScript コードが C++ コンポーネントを参照する方法です。

ActiveX バージョンは、HTML object タグを使用して C++ コンポーネントを参照します。

<object id="OptimizerControl" name="OptimizerControl" classid="CLSID:10FFAAB9-0E73-4C4D-8118-6225C7F2E692"></object>

そのため、ActiveX バージョンは id 値である "OptimizerControl" を使用して COptimizerControl メソッドを呼び出します。

Bing マップ トリップ オプティマイザーの Windows ストア アプリケーション バージョンは、プロジェクト参照を設定し、object タグの代わりにグローバル変数を使用します。 プロジェクト システムは、JavaScript アプリケーションが C++ コンポーネントを特定して読み込むために必要な手順を実行します。 「C++ での Windows ランタイム コンポーネントの作成」の記事では、プロジェクト参照を設定する方法について詳しく説明しています。

ActiveX バージョンは、イベントを処理するために :: の構文を使用します。

// Event handler for progress notifications from the control.
function document.OptimizerControl::ProgressCallback(message) {
   // Set message.
   ProgressMessageText.innerHTML = message;
}

Windows ストア アプリケーション バージョンは、非同期処理を使用して、C++ コンポーネントからの応答に反応することを約束します。 このプロセスについては、「C++ コンポーネントからデータを受け取る」で説明します。

[このページのトップへ]