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

bra*_*tao 11 c c++ dll memory-management

我将代码片段分成了一个,DLL因为它会经常更新,这样就可以更容易部署.

但我对我能做什么以及我不能做什么有疑问DLL.

  1. 我可以通过一个std:stringCString一个DLL
  2. 我可以将指针传递给structwith std::string members并将其填入DLL
  3. 可以DLL返回指向那里分配的结构的指针吗?它会有效吗?我可以删除吗?
  4. 什么应该更好地通过,a std::String或a Cstring

谢谢 !

Ben*_*igt 25

您可以选择:

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

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

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

  • @bratao:您不能从主应用程序中删除在 DLL 中分配的内存。并且DLL 可以使用`std::string`,但它与应用程序中的`std::string` 不同。您不能在应用程序和 DLL 之间传递 `std::string`,而是按照 Mark 的建议传递 `char*`。 (2认同)
  • @Ela782:您必须查看保证的详细信息,但我认为这不会使情况明显好转。ABI 兼容性意味着如果您的原始类型聚合不更改定义,您可以将这些特定的编译器版本视为满足“完全相同的编译器版本”要求。但是`namespace std` 中类的定义仍然会改变(它们必须改变,因为 C++ 标准委员会改变了要求),所以那些仍然不能跨模块边界使用。 (2认同)