c++ - 我可以将 std::string 传递给 DLL 吗?

标签 c++ c dll memory-management

我把一个代码片段分离成一个DLL,因为它会经常更新,这样应该更容易部署。

但我对使用 DLL 可以做什么和不能做什么有疑问。

  1. 我可以将 std:stringCString 传递给 DLL 吗?
  2. 我可以将指针传递给具有std::string 成员struct 并将其填充到DLL 中吗?
  3. DLL 能否返回指向分配在那里的结构的指针?它会有效吗?之后我可以删除它吗?
  4. 传递什么更好,std::String 还是 Cstring

谢谢!

最佳答案

您可以选择:

  • 紧密耦合的 DLL:DLL 是使用与应用程序完全相同的编译器版本、打包和调用约定设置、库选项构建的,并且都动态链接到运行时库 (/MD 编译器选项)。这使您可以来回传递对象,包括 STL 容器,从应用程序内部分配 DLL 对象,从其他模块中的基类派生,几乎可以做任何您可以不使用 DLL 的事情。缺点是您不能再独立于主应用程序部署 DLL。两者必须一起 build 。 DLL 只是为了改善您的进程启动时间和工作集,因为应用程序可以在加载 DLL 之前开始运行(使用 /delayload 链接器选项)。构建时间也比单个模块快,尤其是在使用整个程序优化时。但是优化不会跨越应用程序-DLL 边界进行。并且任何重要的更改仍然需要重建两者。

  • 松耦合:应用程序不依赖于 DLL 定义的对象的类布局。您只使用高度兼容的数据类型:原始类型、指针、函数指针和由这些元素组成的用户定义类型。类继承自定义接口(interface)的基类,没有数据成员,也没有非虚函数(这意味着没有构造函数,也没有共享标准库对象,例如 std::stringCString )。所有分配和对象创建都必须通过工厂函数完成。内存必须从分配它的模块中释放。代码和数据是分开的。头文件明确规定了每个导出函数的调用约定和允许跨越模块边界的每个结构的打包。优点是DLL和应用程序可以完全独立更新。您可以使用新的运行时库、新的编译器版本,甚至用一种全新的语言重建一个,甚至不必接触另一个。

我总是建议使用松散耦合的方法。

关于c++ - 我可以将 std::string 传递给 DLL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347355/

相关文章:

c++ - 在 Visual Studio 2010 C++ 项目中使用 MinGW 构建的 dll

C、将文件的指针传递给函数

c++ - 如何在 dll 或库中隐藏结构成员

c++ - MFC DLL 的 GUI 线束?

c++ - 访问某个dll方法时访问冲突读取位置

c++ - 对 Variadic 模板与 Visual Studio 2010 的混淆

c++ - 为什么不将 `std::initializer_list` 定义为文字类型?

c++ - 使用 Boost Dijkstra 和指定的 MAX DISTANCE 查找最短路径

c - 无法理解c中的空指针

c++ - OpenMP:如何在 PARALLEL block 中正确嵌套 MASTER 和 FOR?