从C ++ DLL导出类?

时间:2009-02-22 14:10:31

标签: c++ winapi visual-c++

如何从dll中公开类?

导入dll的应用程序应该能够创建类的对象,并且他应该能够调用类的成员函数。

是否类似于使用__declspec(dllexport)公开C类型函数?

当我构建dll(它只包含头文件中的类定义及其cpp文件中的成员函数定义)时,也没有创建相应的lib文件。

5 个答案:

答案 0 :(得分:2)

Here。请记住,您不能使用LoadLibrary()/ GetProcAddress()。

来使用此导出的类

答案 1 :(得分:2)

导出类中至少一个公共方法的定义必须具有_declspec(dllexport)前缀才能创建lib文件。如果没有这些方法具有此前缀,则只有声明(即头文件)可用,但该类将无法实例化(导出构造函数是必需的)。如果至少有一个方法有_declspec(dllexport)前缀,那么编译器会理解dll用户必须能够链接到这个dll。一旦exe链接到它们,操作系统就会加载这些dll。

您可以考虑针对您的问题采用“工厂”方法。例如,Symbian OS使用多态dll实现这种方法。要做到这一点,你必须:

  1. 声明(即头文件)并定义(即cpp文件)dll中的类。不需要任何其他东西。

  2. 在你的dll中创建一个“factory”函数,它会为你的类创建一个实例并返回指向它的指针。此函数必须具有_declspec(dllexport)前缀。

  3. 与您的用户共享您的头文件和lib文件。

  4. 用户包括头文件和lib文件的链接。

  5. 用户调用工厂函数来实例化类(即创建对象),然后将其用作普通类。

  6. 上面的5个步骤就像Symbian OS中的魅力一样。您必须在自己的平台上自行尝试并发布结果。坦率地说,我没有在Windows上试过它。

答案 2 :(得分:1)

  

是否类似于使用_declspec(dllexport)公开C类型函数?

是。并且__declspec可以应用于类。

  

没有创建相应的lib文件

IIRC这是默认设置,但您可以覆盖默认链接器选项。

答案 3 :(得分:0)

查看Def Files,其中第一个链接是Using __declspec(dllexport)

答案 4 :(得分:0)

Google搜索“class dllexport”导致this page from MSDN作为第一个结果。

该页面似乎表明只需要__declspec(dllexport)即可。