在模块之间传递STL和/或MFC对象

ssu*_*ube 6 c++ mfc stl

我有一个相当大的代码库,它是高度模块化的(很多很多插件),并且经常需要在模块之间传递字符串等.供参考,代码:

  • 仅在MSVC/Visual Studio中编译,并且非常明显地不会也不会支持其他编译器.支持他们不是一个问题.
  • 仅在Windows上运行,并且非常明显不支持并且不支持其他操作系统.与上述相同.
  • 所有模块都是某种类型的Windows PE; 假设相同的位数,并且它们是为同一平台构建的.
  • 有一些地方MFC比较容易使用,有些地方就是STL.每个模块都有很好的机会.
  • 问题只是关于模块之间传递对象.

现在,我的印象是,如果库或编译器versio发生更改,在模块之间传递STL对象确实会破坏.特别是当涉及到dtors并销毁模块/版本之外的对象时,它们就是在其中创建的.

MFC是否更安全?你能CString安全地将一个MFC对象(例如)从Base.dll传递给Plugin.dll吗?你必须传递一个指针,你不能安全地从插件中删除它吗?

MFC是否静态链接或从DLL使用是否重要?

MSDN在一些地方提到:

常规DLL中的所有内存分配都应保留在DLL中; DLL不应传递给调用可执行文件或从其接收以下任何一项:

  • 指向MFC对象的指针
  • 指向MFC分配的内存的指针

如果您需要执行上述任何操作,或者您需要在调用可执行文件和DLL之间传递MFC派生的对象,则必须构建扩展DLL.

但是,页面扩展DLL提到它们主要用于从MFC对象派生的实现对象.我没有兴趣这样做,只是使用它们并在各种模块之间传递.

传递shared_ptrs会改变任何东西(或带有虚拟dtor的类)吗?

如果没有诉诸C类型,是否有解决方案?

Mar*_*som 4

扩展 DLL 将与应用程序和任何其他扩展 DLL 共享 MFC DLL,以便对象可以在它们之间自由传递。Microsoft 可能希望扩展 DLL 来实现扩展类,但这不是必需的 - 您可以以任何您想要的方式使用它。

标准库最大的危险在于它的大部分内容都是基于模板的。这是危险的,因为如果 DLL 和应用程序是使用不同版本的模板构建的,那么您将违反“单一定义规则”运行,并且未定义的行为会在后面咬您一口。这不仅仅是对象的初始化或销毁,而是针对对象的任何操作!