2009-02-22 109 views
3

如何从dll公开课程?从C++ dll暴露类?

应用程序导入DLL应该能够创建该类的对象,也他应该能够调用到类的成员函数。

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

并且当我建立的DLL(仅包含在头文件中,并在CPP文件及其成员函数定义的类定义),则不创建对应库文件。

回答

1

与使用_declspec(dllexport)公开C型功能相似吗?

是的。而__declspec可以应用于该类。

没有相应的库文件被创建

IIRC这是默认的,但你可以覆盖默认的连接选项。

2

Here。请记住,您不能使用LoadLibrary()/ GetProcAddress()来使用此导出的类。

0

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

的页面似乎表明仅仅有__declspec(dllexport)是所有你需要做的。

2

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

您可能会考虑针对您的问题的“工厂”方法。例如,Symbian操作系统采用多态DLL实现了这种方法。要做到这一点,你必须:

  1. 声明(即头文件)和定义(即cpp文件)在你的dll类。无需其他任何东西。

  2. 创建您的DLL“工厂”的功能,这将使一个实例类,并返回指针。该函数必须具有_declspec(dllexport)前缀。

  3. 与你的用户分享你的头文件和lib文件。

  4. 用户包含头文件并链接到lib文件。

  5. 用户调用工厂功能实例化的类(即使对象),然后用它作为普通的类。

以上5个步骤在Symbian操作系统中就像魅力一样。你将不得不在自己的平台上尝试它并发布结果。坦率地说,我没有在Windows上尝试过。

+1

事实上,我们可以将整个类声明为_declspec(dllexport),它允许类被实例化,并且允许调用成员函数。 (如上面答案中的链接所示)。 – 2009-02-22 14:42:18