UWP - 跨 WinRT 模块重用字符串分析函数的建议方法
UWP - Suggested way for reusing string parsing functions across WinRT modules
我的解决方案中有许多C++项目,这些项目是在我开始使用 UWP 应用之前由其他团队编写的,所有这些项目都使用 std::strings。因此,为了简化其他项目和我的 WinRT 模块之间的通信,我编写了一些字符串转换函数,从 std::string 转到 Platform::String,反之亦然。
我正在将我的 UWP 代码库转换为 WinRT 模块,并且遇到了一个反复出现的问题:由于 WinRT 模块不允许你拥有具有公共本机类型的类或函数,因此我无法公开访问我的字符串函数。私有、受保护或内部声明适用于传递本机类型,只是不能传递公共类型。
我的许多模块需要向下通信到本机C++代码中,我不想为每个需要 std::string 的单独文件一次又一次地重新定义我的字符串函数。
我可以做些什么来跨 WinRT 模块重用我的字符串函数?还有其他人有类似的问题吗?任何建议将不胜感激! 谢谢
您有两个选择。
-
使这些函数内联,并在头文件中定义所有这些函数。然后,将头文件包含在要使用它们的任何位置。这是一个更直接的解决方案,不需要您弄乱您的构建系统。
-
可以将这些函数编译到其中一个 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); }
当你构建 StringModule.dll 时,旁边会创建 StringModule.lib 文件。在生成使用字符串函数的所有 DLL 时,必须将其路径作为参数传递给链接器。在要使用 DLL 的所有位置,只需包含该头文件并照常使用它们。
- 如何在 c++ 的类中递归调用函数方法?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 指向类中函数方法的指针不起作用
- 如何发送通过绑定到函数/方法创建的函数对象?
- 编译错误,未创建函数/方法! 对于 brms 模型
- 对静态重载(类)函数/方法的调用是不明确的
- 复制构造函数方法的用法
- C/C++ 函数/方法与 Java 的公开
- std ::函数方法参考无法将dword投入到dword64
- 链表的析构函数方法
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 我的构造函数方法不接受参数(DirectX / Windows)
- 当函数/方法应该要求 * 或 &
- 带有常量构造函数参数的C++变量构造函数方法
- 使用模板递归检查函数方法是否存在
- 如何通过析构函数方法删除对象(类)
- 为什么在 Java 和 C++ 中不允许隐藏虚拟函数/方法?
- 在构造函数方法中返回一个子类