给定:可执行文件使用dll。它们有不同的c/c++运行时。它们之间的接口存在哪些限制?此外,它们使用相同的编译器,相同的Boost版本(但不同的预编译boost库)。
我理解不同的运行时可以有不同的堆。因此,delete必须对应于同一堆中的new。
最重要的是,我们不能通过接口STL对象传递,因为当我们构建exe STL对象与一个运行时以及在构建dll时,同一个对象(如果通过引用传递或通过接口复制)将与另一个运行时链接。而另一个运行时可以具有该对象的不同实现。
让我们考虑一下情况:
此外,我还想使用一些智能指针来传递对对象的引用(在第3项中提到),从exe传递到dll,从dll传递到exe。我认为这个智能指针还应该重载new/delete,以便从默认进程堆中分配引用计数器。当尝试删除指向对象时,它将调用该对象重载的delete (如item3中的)。
对于第1项中的对象,我希望使用自定义智能指针,它将调用指向对象的释放方法(作为带有自定义发布的boost::shared_ptr )。
没有提到哪些问题?请纠正我。
发布于 2012-07-22 20:48:34
对您的问题的一般回答是:对从EXE/DLL接收的对象进行处理是安全的,如果实际操作不依赖于运行时。例如vtable调用、函数指针调用、DLL中的显式函数调用。
依赖于运行时的东西(来自头文件的内联方法,任何关于STL对象布局的假设,等等)都不安全。
回到你的例子:
备注:
有一些低概率的事情可能会导致上面没有提到的问题:
在总结了一些事情之后,建议看看如何在Microsoft中实现这些东西,并设计一些类似的东西。即将EXE/DLL交互限制在:
https://stackoverflow.com/questions/11601192
复制相似问题