C++ DLL插件界面

Rob*_*ert 5 c++ dll plugins interface

我打算做一个C++插件接口ala 如何从dll创建一些类(dll中的构造函数)?(с++) 但是有人担心如果接口用于通过MinGW或Borland和DLL创建DLL loader是用MSVC++编译的,可能有问题.由于唯一导出的函数被声明为extern"C",我不明白为什么它不起作用?

想法?

Tob*_*ner 11

如果要在编译器(和Release/Debug)之间兼容并使用C++,则需要更多努力.

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

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

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

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

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

如果您只使用C函数和C数据类型,一切都会正常工作.但是你只能在没有类和继承的情况下使用C语言.

我希望有所帮助.


名称修改不是问题:

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

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


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