我将代码片段分成了DLL
,因为它会经常更新,这样就可以更容易部署。
但我对我能做什么以及DLL
无法做什么有疑问。
std:string
或CString
传递给DLL
吗? struct
将指针传递给std::string members
,并将其填入DLL
?DLL
可以返回指向那里分配的结构的指针吗?它会有效吗?我可以删除吗?std::String
或Cstring
?谢谢!
答案 0 :(得分:22)
您可以选择:
紧密耦合的DLL:DLL使用完全相同的编译器版本,打包和调用约定设置,库选项作为应用程序构建,并且都动态链接到运行时库(/MD
编译器选项) 。这使您可以来回传递对象(包括STL容器),从应用程序内部分配DLL对象,从其他模块中的基类派生,在不使用DLL的情况下执行所有操作。缺点是您无法再独立于主应用程序部署DLL。两者必须一起建造。 DLL只是为了改善您的进程启动时间和工作集,因为应用程序可以在加载DLL之前开始运行(使用/delayload
链接器选项)。构建时间也比单个模块快,特别是在使用整个程序优化时。但是优化不会跨应用程序DLL边界发生。任何非平凡的变化仍然需要重建两者。
松散耦合:应用程序不依赖于DLL定义的对象的类布局。您只使用高度兼容的数据类型:基本类型,指针,函数指针和由这些元素组成的用户定义类型。类继承自定义接口的基类,并且没有数据成员且没有非虚函数(这意味着没有构造函数,也没有共享标准库对象,如std::string
或CString
)。所有分配和对象创建必须通过工厂函数完成。必须从分配内存的模块中释放内存。代码和数据是分开的。头文件明确说明每个导出函数的调用约定和允许跨越模块边界的每个结构的打包。优点是DLL和应用程序可以完全独立地更新。您可以使用新的运行时库,新的编译器版本甚至是全新的语言重建一个,而不必触及另一个。
我总是建议使用松散耦合的方法。
答案 1 :(得分:3)
如果基于模板将任何内容传入和传出DLL,则存在危险。编译器选项可以影响对象的布局,模板类不能局限于单个编译单元;其中一些将分发给调用模块。
如果是字符串,我会传递const char *
(或const wchar_t *
或const TCHAR *
)并转换为std::string
或CString
接口的另一面,在DLL中。