2017-07-18 4 views
1

私のUWPアプリケーションで作業を開始する前に、他のチームによって作成された私のソリューションには数多くのC++プロジェクトがあります。 。だから、他のプロジェクトと私のWinRTモジュール間の通信を容易にするために、std :: stringsからPlatform :: Stringsへと変換する文字列変換関数を書きました。UWP - WinRTモジュール間で文字列解析関数を再利用するための推奨方法

私のUWPコードベースをWinRTモジュールに変換している途中です。WinRTモジュールでは、公開されているネイティブタイプのクラスや関数を使用できないため、繰り返し使用することができません。私の文字列関数を一般にアクセス可能にする。 private、protected、またはinternalの宣言は、publicではなく、ネイティブの型を渡すのに適しています。

私のモジュールの多くはネイティブのC++コードに通信する必要があり、std :: stringを必要とする個々のファイルごとに文字列関数を何度も何度も再定義する必要はありません。

WinRTモジュール間で文字列関数を再利用できるように何かできますか?誰かに同様の問題があったのですか?どんな提案も大歓迎です! ありがとうございます

答えて

2

2つのオプションがあります。

  1. これらの関数をインラインにし、すべてをヘッダファイルに定義します。次に、それらを消費するすべての場所にヘッダーファイルを含めます。これは、ビルドシステムを混乱させることなく、より簡単な解決策です。

  2. これらの関数をDLLの1つにコンパイルし、他のDLLにインポートすることができます。あなたの関数を "StringModule.dll"に入れてDLLを呼び出してみましょう。それらの関数を.cpp/.hヘッダーファイルのペアに入れ、その.cppファイルをStringModule.dllにコンパイルする必要があります。次に、StringModule.dllを構築するときに__declspec(dllexport)と評価する定義で関数に注釈を付け、他のすべてのDLLを構築するときは__declspec(dllimport)に注釈を付けます。例えば:

    #ifndef BUILDING_STRING_CONVERSIONS_DLL // This should be defined to 1 when building StringModule.dll 
    #define BUILDING_STRING_CONVERSIONS_DLL 0 
    #endif 
    
    #if BUILDING_STRING_CONVERSIONS_DLL 
    #define MY_STRING_API __declspec(dllexport) 
    #else 
    #define MY_STRING_API __declspec(dllimport) 
    #endif 
    
    namespace MyStringFunctions 
    { 
        MY_STRING_API Platform::String^ ConvertStdStringToPlatformString(const std::string& str); 
        MY_STRING_API std::string ConvertPlatformStringToStdString(Platform::String^ str); 
    } 
    

あなたがStringModule.dllをビルドすると、その横に作成StringModule.libファイルが存在します。文字列関数を使用するすべてのDLLをビルドするときには、引数としてリンカーにそのパスを渡す必要があります。 DLLを使用したい場所では、そのヘッダファイルをインクルードして通常通り使用してください。

+0

私はもともとインラインソリューションを使用するのにいくつかの問題がありました。彼らがクラスの宣言を削除し、代わりにそれらを自由な関数として宣言したら、それは魅力的に機能しました。 ありがとうございました! – Kylaaa

関連する問題