如何从dll(dll中的构造函数)创建一些类?(C ++) 或者如何从dll动态加载类?
答案 0 :(得分:10)
构建DLL时,需要使用__declspec(dllexport)
关键字声明您的类。使用DLL时,需要使用__declspec(dllimport)
声明类:
#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif
class DECLSPEC_CLASS MyClass
{
...
}
编译DLL时,应将-DCOMPILING_DLL添加到定义列表中。
使用该类时,必须静态链接DLL,即将导入库mydll.lib传递给主程序。
如果要在运行时加载DLL ,则需要在DLL中创建一个C函数,该函数会创建一个对象并为您返回。无法在DLL中动态查找构造函数(使用GetProcAddress())。
答案 1 :(得分:3)
您需要从调用构造函数的DLL中导出函数并返回新对象。
尽量避免使用具体的C ++类型作为函数参数; DLL的想法是你可以独立更新它们,但升级后的编译器可能会以不同的方式布局std :: string,导致运行时不兼容。
这就是COM的根源,例如 - 有限类型系统和用于获取对象实例的标准导出函数。
答案 2 :(得分:3)
严格回答你的问题,你需要添加一个extern“C”函数,它返回构造函数的结果:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
然后在您的源代码中,您可以使用“new_foo”上的GetProcAddr来调用该函数。
答案 3 :(得分:3)
除了使用__declspec导出类的每个方法,您还可以依赖编译器可以通过vtable调用虚函数的事实,例如:
//note: no __declspec
class IPublicInterface
{
virtual ~IPublicInterface() = 0;
virtual void SomeMethod() = 0;
};
//note: no __declspec
class SomeClass : IPublicInterface
{
virtual ~SomeClass() { ... }
virtual void SomeMethod() { ... }
};
//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
return new SomeClass();
}