15

私はWebとStackOverflowを多く検索しましたが、私の次の質問には明確な答えが見つからないようです。クロスプラットフォームのC++ライブラリをWindows Phone 8プラットフォームに移植する

コンテキスト:

私はポートにのWindows Phone 8(WP8)プラットフォームで使用するためのC++ヘルパーライブラリのグループを探しています。歴史的に、これらのライブラリは静的ライブラリ(DLLではなく)としてビルドされています。

私はWP8固有のコードを書いているので、ライブラリはWP8(WP API QuickStartドキュメントを参照ポイントとして使用)で使用可能なAPIを使用してARMと互換性がありビルドすることができます。従来のWin32スレッド呼び出しをWinRTのThreadPoolに置き換える必要があるため、ライブラリの1つ(たとえばLib1)のみがWinRT拡張機能(/ ZWフラグ)の消費を必要とします。

Lib1を構築すると、次の警告が表示されます。 警告1警告LNK4264:/ ZWでコンパイルされたオブジェクトファイルを静的ライブラリにアーカイブします。 Windowsランタイムタイプをオーサリングするときは、Windowsランタイムメタデータを含む静的ライブラリにリンクすることはお勧めしません。

- この警告を探して、私は述べ、this articleが見つかりました: 「あなたは公共のREFクラス、パブリックインターフェイスクラス、または公共の値クラスを作成し、静的ライブラリを消費した場合、リンカはこの警告を発生させますあなたが安全に無視することができます。静的ライブラリがライブラリ自体の外部で消費されるWindowsランタイムコンポーネントを生成していないかどうかを警告する静的ライブラリのパブリックコンポーネントはコンパイルされますが、実行時にはアクティブ化されません。ダイナミックリンクライブラリ(DLL)で実装されています。

Lib1では、ClassAにWinRT ThreadPool呼び出しを使用する関数が含まれています。 ClassA関数はClassBによって呼び出され、通常のHANDLEとDWORDをClassBに返します。

コード例:

// ClassA.cpp 
HANDLE WINAPI ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */) 
{ 
    // Do WinRTThreadPool stuff to create WorkItem 
    auto workItem = ref new Windows::System::Threading::WorkItemHandler([=](Windows::Foundation::IAsyncAction^) 
    // More code that eventually results in a Win32 Handle 

    return handle; 
} 

// ClassB.cpp 
Handle handle = ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */); 

にClassAの機能は今までLIB1の中から、ClassBので呼び出され、ClassBのは、LIB1をリンクするアプリケーションで使用することができます。

最後に、私の質問へ:

  1. できる静的LIBSとして建てられたときに、 、Windowsの携帯電話で使用されるC++ ないは、WinRTの拡張(/ ZW)を消費行うライブラリ8つのアプリケーション?静的libのように構築するとき

  2. は、WinRTの拡張 (/ ZW)を消費しないことをC++ライブラリ(LIB1)は、警告にもかかわらず、Windowsの携帯電話8 アプリケーションで使用することはできますか?答えはどちらかの質問にはNOである場合

  3. 、私はそれぞれのライブラリ内のクラスのすべてのためにWinRTの コンポーネントのラッパーを作成する必要があります、this articleよう はマンデルブロアルゴリズムを示していませんか?それとも、私は行方不明ですか?

ご提供いただける入力がありましたら、事前にお知らせください。

答えて

5

質問1 はい、限り、あなたは携帯電話上で許可されていないすべてのAPI、例えばなどのWin32、MFC、標準C機能の一部を使用していないとして、それらの周りにいくつかの制約があります。たとえば、アプリケーションのローカルエリアにあるファイルに対してのみfopenを呼び出すことができます。もちろん、静的なlibの機能はC++コードからしかアクセスできません。このシナリオは、私が "Plain Old C++"シナリオと呼ぶようなものです。それはうまく動作します。

質問2 はい、限り、あなたはその静的libに定義したREFクラスはそれだけで静的libに内から使用することを意図しています。したがって、あなたの例では、クラスAが普通の古いC++クラスである限り、あなたはうまくいくでしょう。基本的には、.NETアセンブリのパブリッククラスと同じ意味で公開されているrefクラスを持つことはできません。これは、COM-on-steroidの魔法を必要とし、Windowsランタイムコンポーネントのみにコンパイルされるからです。任意のrefクラスコードへの呼び出しをラップするプレーンな古いC++コードがあり、静的なlibを消費するコードは普通の古いC++の方法でそれを使います。ロジックは、静的なlibからWinRT型を渡すことができないことを示唆していますが、私はまだその仮定をテストしていません。私はあなたが参照する記事が、コードが静的libになどREFクラスにアクセスすることができるという事実を逃すので、心配しないで、あなたはあなたの周りのWindowsランタイムコンポーネントのラッパーを記述する必要はありません信じて

質問3 静的ライブラリ。静的なlibのコードを "Public Classes"(.NETアセンブリの意味で)で利用できるようにしたい場合にのみ、これを行うだけです。

覚えておくべきことは、「Windowsストア用の静的なライブラリ」を構築していることです。これはネイティブコードですが、それでもC++/CXのすべての処理を行うことができます。静的にリンクされたC++シナリオの外側で定義された型をアクセスできるようにするには、COMアクティベーション処理は含まれません。

関連する問題