2011-01-21 84 views

回答

10

如果您希望在编译器(以及Release/Debug)中兼容并使用C++,则需要多花点功夫。

基本上 - 您可以传递基本的数据类型和指向纯虚拟类的指针。这些类不能包含任何数据成员,它们的析构函数不能是公有的,它们不应该有重载函数。

内存不能分配在一个DLL中,并在另一个DLL中释放。这意味着没有例外,您需要某种引用计数或返回机制。

纯虚拟类(又名“接口”)内的所有方法都必须标记为调用约定(我更喜欢stdcall)。

动态转换也是不可能的,因此您可能需要在所有接口中执行一些功能来完成这些技巧(如COM中的QueryInterface)。

这是可行的,因为win32上的大多数编译器都尝试与COM兼容,并以COM兼容的方式解决相同的问题。为了获得第一个接口,您需要一个从dll导出的纯C函数。

如果你只是使用C函数和C数据类型,一切都会工作。但是,那么你只能继承C而不能继承类。

我希望有帮助。


名称重整是没有问题的:

1:如果您使用的C函数C数据类型,一切都被定义,没有名称重整(例外:在VS与STDCALL,您需要重新映射通过链接器指令将名称改为“正常”C名称)

第二种:类内的方法不会被导出,因此不会被损坏。您可以通过指向纯虚拟类的指针(又名“接口”)来调用方法。这使用一个偏移量和没有名字。你仍然不能使用析构函数,因为据我所知,vtbl内部析构函数的位置并不是固定的。


如果您将结构传递给函数/方法,请务必修复对齐。它没有在不同的编译器中定义。

0

一个想法可能是使用标准的extern C函数来创建一个ClassFactory。对于一个固定的(或更多)入口点来说,dll必须公开一个有效的插件。

+0

是的,唯一导出的函数是extern“C”Plugin * GetPluginObject()。我之前完成了这个工作,但后来我控制了DLL(即不让MinGW/Borland等进入方程) – Robert 2011-01-21 09:04:36

+0

如果你的GetPluginObject返回一些从某个* pure *虚拟类派生的类的istance,那么aren不同编译器实现之间的VTable是否兼容?我认为微软COM利用这些想法... – 2011-01-21 09:06:58