2011-09-23 61 views
6

我有一个相当大的代码库,它是高度模块化的(很多插件),并且经常需要在模块之间传递字符串等。作为参考,代码:在模块之间传递STL和/或MFC对象

  • 只在MSVC/Visual Studio中编译,很明显不会,也不会支持其他编译器。支持他们不是一个问题。
  • 只能在Windows上运行,很明显不会,也不会支持其他操作系统。同上。
  • 所有模块都是某种Windows PE;假设相同的位,并且它们是为相同的平台而构建的。
  • 有几个地方MFC更容易使用,其中一些地方是STL。在每个模块中都有很好的机会。
  • 问题是只有关于通过对象之间模块。

现在,我的印象是,如果库或编译器版本发生更改,传递模块之间的STL对象可能会中断。特别是当涉及到模块/版本之外的dtors和破坏对象时,它们就被创建了。

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

如果MFC静态链接或使用DLL是否有关系?

MSDN中提到的那几个地方:

常规DLL中的所有内存分配应该留在DLL中;该DLL不应该通过或从主叫接收可执行以下任何一项:

  • 指针MFC对象
  • 内存指针由MFC

分配如果您不需要做任何的上面,或者如果您需要在调用的可执行文件和DLL之间传递MFC派生的对象,那么您必须构建一个扩展DLL。

但是,the page extension DLLs提到它们主要用于从MFC对象派生的实现对象。我对此没有兴趣,只是使用它们并在各个模块之间传递。

是否通过shared_ptrs改变任何东西(或与虚拟dtor类)?

有没有解决方案,而不诉诸C类型?

回答

4

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

标准库最大的危险在于它大量的基于模板。这很危险,因为如果DLL和应用程序是使用不同版本的模板构建的,则针对One Definition Rule运行,而未定义的行为会让您在后面咬你。这不仅仅是对对象的初始化或破坏,而且是针对对象的任何操作!

+0

我的理解是,使MFC扩展需要客户端(无论使用DLL的可执行文件?)也必须使用MFC和相同的版本。看起来这将排除更新DLL和使用MFC,如果客户端最初没有使用它。它是否正确?这似乎是一个很好的解决方案,否则。 – ssube

+0

@peachykeen,是的,应用程序必须使用MFC。是的,它应该是与DLL所使用的版本相同的版本,但我不确定不匹配的后果 - MFC倾向于比C++库更快地发展,并且因为它们都不基于模板I我不确定从版本到版本的不兼容性。 –

0

您可以声明类似COM的abstruct方法接口并传递接口。例如,编写一个像WMCreateReader这样的工厂方法,它可以创建一个对象(不管它是基于MFC还是让STL成员不需要暴露给调用者)并返回它的接口。

+0

我已经使用了相当多的接口来传递对象并知道插件会提供什么;如何解决传递,例如,字符串? – ssube

+0

将它们传递为BSTR,可能? –