如何在C ++中用dll(dll中的构造函数)创建一些类?

时间:2009-10-04 13:59:26

标签: c++ winapi constructor

如何从dll(dll中的构造函数)创建一些类?(C ++) 或者如何从dll动态加载类?

4 个答案:

答案 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();
}