【问题标题】:Exporting a class from a C++ dll?从 C++ dll 导出一个类?
【发布时间】:2009-02-22 14:10:31
【问题描述】:

如何从 dll 中公开一个类?

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您可以考虑采用“工厂”方法来解决您的问题。例如,Symbian OS 使用多态 dll 实现了这种方法。为此,您必须:

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

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

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

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

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

      上面的 5 个步骤在 Symbian OS 中很有效。您必须自己在您的平台上尝试并发布结果。坦率地说,我还没有在 Windows 上尝试过。

      【讨论】:

      • 事实上,我们可以将整个类声明为 _declspec(dllexport) ,这将允许实例化类并允许调用成员函数。 (如上述答案中的链接所示)。
      【解决方案3】:

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

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

      没有创建对应的lib文件

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

      【讨论】:

        【解决方案4】:

        看看Def Files,另外第一个链接是Using __declspec(dllexport)

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2010-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-15
            • 2015-12-21
            • 2011-09-09
            相关资源
            最近更新 更多