15

WebとStackOverflowを何度も検索しましたが、次の質問に対する明確な答えが見つからないようです。

コンテクスト:

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

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

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

—この警告を検索して、この記事を見つけました。「パブリックrefクラス、パブリックインターフェイスクラス、またはパブリック値クラスを作成する静的ライブラリを使用する場合、リンカはこの警告を発生させます。静的な場合は警告を無視しても問題ありません。ライブラリは、ライブラリ自体の外部で消費されるWindowsランタイムコンポーネントを生成していません。静的ライブラリのパブリックコンポーネントはコンパイルされますが、実行時にアクティブ化されません。他のコンポーネントまたはアプリによる消費を目的としたWindowsランタイムコンポーネントは、動的に実装する必要があります。 -リンクライブラリ(DLL)。」

Lib1では、ClassAにWinRTThreadPool呼び出しを使用する関数が含まれています。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. WinRT拡張機能(/ ZW)を使用しないC ++ライブラリを静的ライブラリとして構築した場合、Windows Phone 8アプリケーションで使用できますか?

  2. WinRT拡張機能(/ ZW)を使用するC ++ライブラリ(Lib1)、静的ライブラリとしてビルドされた場合、警告にもかかわらず、Windows Phone 8アプリケーションで使用できますか?

  3. どちらの質問にも答えがない場合、この記事がマンデルブロアルゴリズムで示すように、それぞれのライブラリのすべてのクラスに対してWinRTコンポーネントラッパーを作成する必要がありますか?それとも私が見逃しているものが他にありますか?

あなたが提供できるどんな入力にも前もって感謝します。

4

1 に答える 1

5

質問 1 はい。電話で許可されていない API (Win32、MFC など) を使用していない場合に限ります。標準の c 機能の一部には、いくつかの制約があります。たとえば、アプリケーションのローカル領域にあるファイルに対してのみ fopen を呼び出すことができます。もちろん、静的ライブラリの機能には C++ コードからしかアクセスできません。このシナリオは、私が「Plain Old C++」シナリオと呼んでいるものです。それは正常に動作します。

質問 2 その静的ライブラリで定義する ref クラスが、その静的ライブラリ内からのみ使用されることを意図している限り、はい。したがって、あなたの例では、クラス A が通常の古い C++ クラスである限り、問題ありません。基本的に、.NET アセンブリ内のパブリック クラスと同じ意味でパブリックな ref クラスを使用することはできません。これには、COM-on-steroids マジックが必要であり、Windows ランタイム コンポーネントにのみコンパイルされるためです。任意の ref クラス コードへの呼び出しをラップする単純な古い C++ コードがあり、静的ライブラリを使用するコードがそれを単純な古い C++ の方法で使用する場合は、問題ありません。論理的には、静的ライブラリから WinRT 型を渡すことはできないと示唆されていますが、私はその仮定をまだテストしていません。

質問 3 あなたが参照している記事は、静的ライブラリのコードが ref クラスなどにアクセスできるという事実を見逃していると思います。心配しないでください。静的ライブラリの周りに Windows ランタイム コンポーネント ラッパーを記述する必要はありません。静的ライブラリのコードを「パブリック クラス」を介して (.NET アセンブリの意味で) 利用できるようにする場合にのみ、これを行います。

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

于 2013-05-01T06:11:59.497 に答える