C++ DLL导出类

   在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架。在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发。

   参考了很多这方面的资料,对DLL有一个基本全面的了解。有一个问题让我有点困惑,普通的导入导出C++类的方式都是使用_declspec(dllexport) /_declspec(dllimport)来导入导出类,但是在公司的开发中我们没有导入导出,而是定义了一些只有纯虚函数的抽象类,然后定义了一个工厂类,将这个工厂类注册到框架的服务中心中,使用时从服务中心拿到这个工厂类,就可以创建Dll中的其它类。对这种使用方式我不太理解,google+百度搜索了很多这方面的内容,很多blog讲到了这种使用方式,但是也没有讲清楚这样使用的原理,后来找到了一篇老外写的blog,讲得比较清楚。

   使用只有纯虚函数的抽象类之所以不需要导出,是因为纯虚函数的虚表使然。下面是同老外的bkig中抽出来的一个示例。

   纯虚函数类的定义如下:

// The abstract interface for Xyz object.
// No extra specifiers required.
struct IXyz
{
    virtual int Foo(int n) = 0;
    virtual void Release() = 0;
};

// Factory function that creates instances of the Xyz object.
extern "C" XYZAPI IXyz* APIENTRY GetXyz();

   使用dll的代码如下:

#include "XyzLibrary.h"

...
IXyz* pXyz = ::GetXyz();

if(pXyz)
{
    pXyz->Foo(42);

    pXyz->Release();
    pXyz = NULL;
}
该示例中导出了一个方法来创建IXyz对象,但是并没有导出IXyz对象,IXyz类中只有纯虚函数。这是如何实现的呢?我所知道的是,需要将Dll中的类导出,导出的符号将放到导出符号表中,在链接的时候根据这些符号来定位函数的地址,这个IXyz类没有声明导出,当然类中的函数就不回生成在导出符号表中,那么怎么定位到函数的地址呢?下面这张原文中的图给出了很清晰的解释:


图中的伪代码部分解释了函数的调用过程,是通过虚表来定位函数的。因为定义的是只有纯虚函数的抽象类,这样的类编译之后会有一个纯粹的虚表,可以通过这张纯粹的虚表来进行函数调用,所以通过这种方式来使用dll的第一步是应以只带纯虚函数的抽象类,或者说接口。
更多内容,参见:

Export C++ classes from a DLL

  


  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值