C ++ DLL插件界面

时间:2011-01-21 08:54:03

标签: c++ dll plugins interface

我打算做一个C ++插件接口ala How to create some class from dll(constructor in dll)?(с++) 但是有人担心如果接口用于通过MinGW或Borland创建DLL并且DLL加载器是用MSVC ++编译的,则可能存在问题。由于唯一导出的函数被声明为extern“C”,我不明白为什么它不起作用?

想法?

2 个答案:

答案 0 :(得分:11)

如果您希望在编译器(和发布/调试)之间兼容并使用C ++,则需要更多的努力。

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

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

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

动态强制转换也是不可能的,因此您可能需要在所有接口中使用某些功能来完成这一操作(如COM中的QueryInterface)。

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

如果您只使用C函数和C数据类型,一切都会正常工作。但是那时你只限于没有课程的C和继承。

我希望有所帮助。


名称修改不是问题:

第一:如果你使用C函数和C数据类型,一切都已定义,没有名称重整(例外:在VS中使用STDCALL,你需要通过Linker指令将名称重新映射为“普通”C名称)

第二:类中的方法不会被导出,因此不会被破坏。您可以通过指向纯虚拟类(也称为“接口”)的方法调用方法。这使用偏移而没有名称。你仍然不能使用析构函数,因为据我所知,vtbl中析构函数的位置并不固定。


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

答案 1 :(得分:0)

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