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をリンクするアプリケーションで使用できます。
最後に、私の質問に:
WinRT拡張機能(/ ZW)を使用しないC ++ライブラリを静的ライブラリとして構築した場合、Windows Phone 8アプリケーションで使用できますか?
WinRT拡張機能(/ ZW)を使用するC ++ライブラリ(Lib1)は、静的ライブラリとしてビルドされた場合、警告にもかかわらず、Windows Phone 8アプリケーションで使用できますか?
どちらの質問にも答えがない場合、この記事がマンデルブロアルゴリズムで示すように、それぞれのライブラリのすべてのクラスに対してWinRTコンポーネントラッパーを作成する必要がありますか?それとも私が見逃しているものが他にありますか?
あなたが提供できるどんな入力にも前もって感謝します。