C++ DLL导出类
来源:互联网 发布:企业社保报盘软件 编辑:程序博客网 时间:2024/06/11 06:01
在公司使用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的第一步是应以只带纯虚函数的抽象类,或者说接口。
更多内容,参见:
- DLL C/C++导出
- DLL概念,DLL导出类
- 用DEF文件从DLL中导出C编程++类
- 用DEF文件从DLL中导出C编程++类
- DLL导出类问题
- DLL 导出类
- 【zz】DLL 导出类
- dll导出stl类
- MFC DLL导出类
- DLL导出类
- dll导出类
- dll导出类
- dll导出类
- DLL导出类
- DLL 导出类
- C++ DLL导出类
- dll之导出类
- MFC DLL导出类
- C#获取当前页面的URL
- 使用Duilib的一些技术
- 单例模式
- 用flexigrid实现分页显示 二
- 介绍下javabean
- C++ DLL导出类
- U-Boot(7) u-boot入口点之CPU模式切换
- SQL高级查询--decode()函数
- 成为“Android高手”需要经过的六个阶段和6个境界
- hadoop集群部署
- RAID 详解
- alfresco4.2 安装心得
- zedboard--基于demo系统的webcam和webserver的联合使用(二十三)
- 同余与模运算