2017-07-18 54 views
1

我的解決方案中有很多C++項目是由其他團隊編寫的,然後開始處理我的UWP應用程序,所有這些項目都使用std :: strings 。所以,爲了簡化其他項目和我的WinRT模塊之間的通信,我編寫了一些字符串轉換函數,從std :: strings到Platform :: Strings,反之亦然。UWP-重用WinRT模塊中字符串解析函數的建議方法

我正在將我的UWP代碼庫轉換爲WinRT模塊,我遇到了一個反覆出現的問題:因爲WinRT模塊不允許您使用公有本機類型的類或函數,所以我無法讓我的字符串函數可公開訪問。私有的,受保護的或內部的聲明適用於傳遞本地類型,只是不公開。

我的許多模塊需要向下傳遞到本機C++代碼,我不想爲每個需要std :: string的單個文件重新定義我的字符串函數。

有什麼我可以做,所以我可以在WinRT模塊中重用我的字符串函數?有其他人有類似的問題嗎?任何建議,非常感謝! 謝謝

回答

2

你有兩種選擇。

  1. 讓那些內聯函數,並定義在頭文件中所有的人。然後,將頭文件包含在任何想要使用它們的位置。這是一個更直接的解決方案,不需要你混淆你的構建系統。

  2. 您可以將這些函數編譯到您的DLL之一中,然後將它們導入到其他函數中。讓我們調用你的函數在「StringModule.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