8.DLL导出C++类
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++类相关推荐
- C++关于DLL导出模板类和模板函数
这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料.自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的Open Source项目,确实如此.这里记 ...
- dll的概念、dll导出类(转)
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- DLL导出类和导出函数
from:https://blog.csdn.net/goodluckmt/article/details/52691297 1.动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用 ...
- C++dll导出类的方式__declspec(dllexport)
前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...
- c#调用C++写的dll导出类,如何实现
网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...
- 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法
转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...
- MFC DLL 导出函数的定义方式
一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...
- DLL 导出方法(两种)
使用 DEF 文件从 DLL 导出 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件. 如果不使用 __declspec(dllexport) 关键字 ...
- VC++ DLL 导出函数
VC++ DLL 导出函数 经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关 ...
最新文章
- mongodb重命名集合、数据库
- R语言ggplot2可视化分面图(facet,facet_wrap): 不同分面配置不同的数据范围、自定义每个分面的轴数据格式化形式及数据范围
- 用UltraISO制作U盘启动盘,支持windows 7
- Camel中的几个重要概念之 Components
- 新版征信对信用卡养卡会有重大影响吗?
- 最小生成树——Prim(普利姆)算法
- 自动化 测试框架部署(python3+selenium2)
- OpenCV中的函数子
- 程序员都在用的IDEA插件(不断更新)
- 误删除Linux中libc.so.6文件急救办法
- Java中逗号运算符的使用
- 简单实用的数据可视化案例
- 研发管理 - 流程篇
- php 爬虫 执行js,php爬虫执行js,php执行js
- 用C语言实现推箱子小游戏基础程序
- 【修真院PM小课】什么是消息推送?
- 记一次Java代码不执行,也不报错!求大佬赐教!
- ArcGIS API for JavaScript 3.24 文字标注的添加和带背景的文字添加
- 模拟退火算法团簇matlab,基于模拟退火优化算法的二元团簇结构优化方法与流程...
- 交互设计 - 用户体验【摘】