C++ DLL导出类
2013-11-02 11:22
211 查看
在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架。在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发。
参考了很多这方面的资料,对DLL有一个基本全面的了解。有一个问题让我有点困惑,普通的导入导出C++类的方式都是使用_declspec(dllexport) /_declspec(dllimport)来导入导出类,但是在公司的开发中我们没有导入导出,而是定义了一些只有纯虚函数的抽象类,然后定义了一个工厂类,将这个工厂类注册到框架的服务中心中,使用时从服务中心拿到这个工厂类,就可以创建Dll中的其它类。对这种使用方式我不太理解,google+百度搜索了很多这方面的内容,很多blog讲到了这种使用方式,但是也没有讲清楚这样使用的原理,后来找到了一篇老外写的blog,讲得比较清楚。
使用只有纯虚函数的抽象类之所以不需要导出,是因为纯虚函数的虚表使然。下面是同老外的bkig中抽出来的一个示例。
纯虚函数类的定义如下:
使用dll的代码如下:
图中的伪代码部分解释了函数的调用过程,是通过虚表来定位函数的。因为定义的是只有纯虚函数的抽象类,这样的类编译之后会有一个纯粹的虚表,可以通过这张纯粹的虚表来进行函数调用,所以通过这种方式来使用dll的第一步是应以只带纯虚函数的抽象类,或者说接口。
更多内容,参见:
Export C++ classes from a 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
相关文章推荐
- c语言实现顺序结构的线性表,可自动增加长度的
- 迭代器和迭代器适配器---《C++标准程序库》读书笔记
- C++之拷贝构造函数
- C++ 一些参数传递技巧及建议及局部静态函数
- AfxBeginThread和CreateThread具体区别 分类: VC++ 2013-11-02 09:10 597人阅读 评论(0) 收藏
- 同步多线程 分类: VC++ 2013-11-02 08:50 701人阅读 评论(0) 收藏
- C++.polymorphism.Simulation of JAVA's DB Interface
- LBP C++实现代码
- C++11并发内存模型学习
- C/C++浮点数在内存中的存储方式
- C/C++中如何写长串(字符数组的拼接)?
- 设计模式:单件模式(5)C++版
- C语言 串 顺序结构 实现
- C++运行时类型识别(RTTI)
- 16进制数转十进制数—实现C语言
- C++用CreateProcess来打开IE (可隐藏IE窗口)
- c语言中动态内存申请与释放的简单理解
- 有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低)
- C++多态的实现原理
- C语言之指针