DLL中不仅可以导出函数和变量,也可以导出C++类。只需要在导出类名前关键字class后加上_declspec(dllexport),就可以实现导出类

1.DLL简单导出类代码

class _declspec(dllexport) Stu
{
public:Stu(int a);void print();private:int _a;
};

实例:

.cpp文件:

// DynamicLib.cpp: 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"#define _DLL_EXPORTS
#include "func.h"#include <iostream>
using namespace std;Stu::Stu(int a)
{this->_a = a;
}void Stu::print()
{cout << _a << endl;
}

func.h文件:

#pragma once#ifdef _DLL_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endifclass DLL_API Stu
{
public:Stu(int a);void print();private:int _a;
};

在dependency中查看导出的DLL:

可以发现,导出了四个函数,一个为构造函数、一个为拷贝构造函数、一个为析构函数,还有一个就是我们自己定义的print函数

测试:

#include <iostream>
using namespace std;
#include "func.h"#pragma comment(lib,"DynamicLib.lib")int main()
{Stu stu1(666);stu1.print();system("pause");return 0;
}

结果:

2.简单导出类的缺点

这种简单导出类的方式,除了导出的东西太多、使用者对类的实现依赖太多以外,还有其他问题:必须保证使用同一种编译器。导出类的本质是导出类里的函数,因为语法上直接导出了类,没有对函数的调用方式、重命名进行设置,导致了产生的dll并不通用。

3.导出类的较好方式

定义一个抽象类(都是纯虚函数),调用者跟dll共用一个抽象类的头文件,dll中实现此抽象类的派生类,dll最少只需要提供一个用于获取抽象类对象指针的接口。

4.面向抽象设计优点

这种方式利用了C++类的虚函数,类似COM思想,采用接口跟实现分离,可以使得工程的结构更清晰,使用者只需要知道接口,而无需知道具体实现,产生的DLL通用没有特定环境限制。

5.注意事项

调用者跟DLL共用一个抽象类的头文件,调用者依赖于DLL的东西很少,只需要知道抽象类的接口,以及获取对象指针的导出函数,对象内存空间的申请和释放都在DLL模块中完成

6.代码演示

DLL生成代码:

.cpp文件:

// DynamicLib.cpp: 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"#define _DLL_EXPORTS
#include "func.h"#include <iostream>
using namespace std;class Cat :public IAnimal
{
public:Cat(){cout << "Cat is created" << endl;}~Cat(){cout << "Cat is deleted" << endl;}virtual void eat(){cout << "Cats eat fish" << endl;}virtual void sleep(){cout << "Cats sleep" << endl;}virtual void delObj(){delete this;}
};extern "C" DLL_API IAnimal *GetCat()
{return new Cat;
}

func.h文件:

#pragma once#ifdef _DLL_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endifclass IAnimal
{
public:virtual void eat() = 0;virtual void sleep() = 0;virtual void delObj() = 0;
};extern "C" DLL_API IAnimal *GetCat();

在dependency中查看导出的DLL:

发现导出的只有一个类名

调用者代码:

#include <iostream>
using namespace std;
#include "func.h"#pragma comment(lib,"DynamicLib.lib")int main()
{IAnimal *p = GetCat();p->eat();p->sleep();p->delObj();system("pause");return 0;
}

执行结果:

8.DLL导出C++类相关推荐

  1. C++关于DLL导出模板类和模板函数

    这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料.自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的Open Source项目,确实如此.这里记 ...

  2. dll的概念、dll导出类(转)

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  3. DLL导出类和导出函数

    from:https://blog.csdn.net/goodluckmt/article/details/52691297 1.动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用 ...

  4. C++dll导出类的方式__declspec(dllexport)

    前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...

  5. c#调用C++写的dll导出类,如何实现

    网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...

  6. 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法

    转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...

  7. MFC DLL 导出函数的定义方式

    一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...

  8. DLL 导出方法(两种)

    使用 DEF 文件从 DLL 导出 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件. 如果不使用 __declspec(dllexport) 关键字 ...

  9. VC++  DLL 导出函数

    VC++ DLL  导出函数 经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关 ...

最新文章

  1. mongodb重命名集合、数据库
  2. R语言ggplot2可视化分面图(facet,facet_wrap): 不同分面配置不同的数据范围、自定义每个分面的轴数据格式化形式及数据范围
  3. 用UltraISO制作U盘启动盘,支持windows 7
  4. Camel中的几个重要概念之 Components
  5. 新版征信对信用卡养卡会有重大影响吗?
  6. 最小生成树——Prim(普利姆)算法
  7. 自动化 测试框架部署(python3+selenium2)
  8. OpenCV中的函数子
  9. 程序员都在用的IDEA插件(不断更新)
  10. 误删除Linux中libc.so.6文件急救办法
  11. Java中逗号运算符的使用
  12. 简单实用的数据可视化案例
  13. 研发管理 - 流程篇
  14. php 爬虫 执行js,php爬虫执行js,php执行js
  15. 用C语言实现推箱子小游戏基础程序
  16. 【修真院PM小课】什么是消息推送?
  17. 记一次Java代码不执行,也不报错!求大佬赐教!
  18. ArcGIS API for JavaScript 3.24 文字标注的添加和带背景的文字添加
  19. 模拟退火算法团簇matlab,基于模拟退火优化算法的二元团簇结构优化方法与流程...
  20. 交互设计 - 用户体验【摘】

热门文章

  1. 越夜越美 在黑暗中华为P20系列绽放绚烂之光
  2. @Transient com JPA:3个主题!
  3. 服务器安全设置针对硬盘权限篇
  4. 如何解决苹果电脑弹出本地项目钥匙串提示?
  5. 安卓代码怎么设置省电模式_安卓手机怎么设置省电模式
  6. ipad学习记笔记电子手帐goodnotes和notability教程
  7. TextBox中只能输入数字的几种常用方法(C#)
  8. 获取鼠标在盒子里的位置
  9. python爬虫抓取微信头像
  10. MySQL语句练习50题