我打算做一个C++插件接口ala How to create some class from dll(constructor in dll)?(с++) 但有人担心,如果接口用于通过MinGW或Borland创建DLL并且DLL加载器是使用MSVC++编译的,则可能存在问题。由于唯一导出的函数被声明为extern“C”,我不明白为什么它不起作用?C++ DLL插件接口
想法?
我打算做一个C++插件接口ala How to create some class from dll(constructor in dll)?(с++) 但有人担心,如果接口用于通过MinGW或Borland创建DLL并且DLL加载器是使用MSVC++编译的,则可能存在问题。由于唯一导出的函数被声明为extern“C”,我不明白为什么它不起作用?C++ DLL插件接口
想法?
如果您希望在编译器(以及Release/Debug)中兼容并使用C++,则需要多花点功夫。
基本上 - 您可以传递基本的数据类型和指向纯虚拟类的指针。这些类不能包含任何数据成员,它们的析构函数不能是公有的,它们不应该有重载函数。
内存不能分配在一个DLL中,并在另一个DLL中释放。这意味着没有例外,您需要某种引用计数或返回机制。
纯虚拟类(又名“接口”)内的所有方法都必须标记为调用约定(我更喜欢stdcall)。
动态转换也是不可能的,因此您可能需要在所有接口中执行一些功能来完成这些技巧(如COM中的QueryInterface)。
这是可行的,因为win32上的大多数编译器都尝试与COM兼容,并以COM兼容的方式解决相同的问题。为了获得第一个接口,您需要一个从dll导出的纯C函数。
如果你只是使用C函数和C数据类型,一切都会工作。但是,那么你只能继承C而不能继承类。
我希望有帮助。
名称重整是没有问题的:
1:如果您使用的C函数C数据类型,一切都被定义,没有名称重整(例外:在VS与STDCALL,您需要重新映射通过链接器指令将名称改为“正常”C名称)
第二种:类内的方法不会被导出,因此不会被损坏。您可以通过指向纯虚拟类的指针(又名“接口”)来调用方法。这使用一个偏移量和没有名字。你仍然不能使用析构函数,因为据我所知,vtbl内部析构函数的位置并不是固定的。
如果您将结构传递给函数/方法,请务必修复对齐。它没有在不同的编译器中定义。
一个想法可能是使用标准的extern C函数来创建一个ClassFactory。对于一个固定的(或更多)入口点来说,dll必须公开一个有效的插件。
是的,唯一导出的函数是extern“C”Plugin * GetPluginObject()。我之前完成了这个工作,但后来我控制了DLL(即不让MinGW/Borland等进入方程) – Robert 2011-01-21 09:04:36
如果你的GetPluginObject返回一些从某个* pure *虚拟类派生的类的istance,那么aren不同编译器实现之间的VTable是否兼容?我认为微软COM利用这些想法... – 2011-01-21 09:06:58