UWP - 在WinRT模块中重用字符串解析函数的建议方法

时间:2017-07-18 03:34:09

标签: c++ string uwp windows-runtime code-reuse

我的解决方案中有许多C ++项目,在我开始使用我的UWP应用程序之前由其他团队编写,所有这些项目都使用std :: strings。因此,为了简化其他项目和我的WinRT模块之间的通信,我编写了一些字符串转换函数,从std :: strings转到Platform :: Strings,反之亦然。

我正在将我的UWP代码库转换为WinRT模块,而且我遇到了一个反复出现的问题:因为WinRT模块不允许您使用公共本机类型的类或函数,我无法公开访问我的字符串函数。私有,受保护或内部声明适用于传递本机类型,只是不公开。

我的许多模块都需要与本机C ++代码进行通信,而且我不想一次又一次地为需要std :: string的每个文件重新定义我的字符串函数。

我有什么可以做的,所以我可以在WinRT模块中重用我的字符串函数吗?有没有其他人有类似的问题?任何建议都非常感谢! 谢谢

1 个答案:

答案 0 :(得分:2)

您有两种选择。

  1. 使这些函数内联,并在头文件中定义所有函数。然后,在您想要使用它们的任何位置包含头文件。这是一个更直接的解决方案,不需要你搞乱你的构建系统。

  2. 您可以将这些函数编译到其中一个DLL中,然后将它们导入到其他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);
    }
    
  3. 构建StringModule.dll时,会在其旁边创建StringModule.lib文件。在构建使用字符串函数的所有DLL时,您必须将其路径作为参数传递给链接器。在您想要使用DLL的所有地方,只需包含该头文件并照常使用它们。