首页 > 编程语言 >VC++ __declspec(dllexport) 和 __declspec(dllimport)

VC++ __declspec(dllexport) 和 __declspec(dllimport)

时间:2024-10-27 16:01:56浏览次数:1  
标签:__ dllimport declspec DLL dll dllexport

头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)

Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport), 使用的时候__declspec(dllimport)就派上用场了,他会告诉使用dll的工程去lib中找到这个静态变量的定义。


加载一个dll时,其实你的程序是运行在两个独立空间的(dll的空间和你自己的程序空间),dll的对象模型其实相当严格,要访问dll空间的变量和函数,必须导出他们,否则这些对象是不可见的。这可以通过加入一个def文件,或者在声明中使用__declspec(dllimport)前缀,告诉编译器以下这些变量和函数是从dll导出的。同时定义这些变量的dll源文件必须加上__declspec(dllexport)前缀,告诉编译器这些函数需要被导出。

对类对象来说,静态成员函数必须加上这个前缀,因为这些对象都是在dll空间内的。在类的前面加上这些前缀就对整个类的成员进行了声明。这样在你的dll工程中定义__DLLEXPORT_IMP,__DLLEXPORT就会根据不同的工程转换成相应的前缀声明了。如果不加入这些前缀,链接会出现找不到符号的错误,因为这些符号在lib文件中被隐藏了。

使用虚函数导出(不使用_declspec(dllexport) / _declspec(dllimport))

导出类是一个派生类,派生自一个抽象类——都是纯虚函数。使用者需要知道这个抽象类的结构。DLL最少只需要提供一个用于获取类对象指针的接口。使用者跟DLL提供者共用一个抽象类的头文件,使用者依赖于DLL的东西很少,只需要知道抽象类的接口,以及获取对象指针的导出函数,对象内存空间的申请是在DLL模块中做的,释放也在DLL模块中完成,最后记得要调用释放对象的函数。

这种方式通用,产生的DLL没有特定环境限制。借助了C++类的虚函数。一般都是采用这种方式。除了对DLL导出类有好处外,采用接口跟实现分离,可以使得工程的结构更清晰,使用者只需要知道接口,而不需要知道实现。




参考:
  1. https://blog.csdn.net/yaotuzhi/article/details/108037549

  2. https://www.cnblogs.com/depend-wind/articles/11126333.html

  3. https://blog.csdn.net/zengchenAAA/article/details/138107202?spm=1001.2014.3001.5502

标签:__,dllimport,declspec,DLL,dll,dllexport
From: https://www.cnblogs.com/huvjie/p/18508516

相关文章

  • 云电脑是什么
    云电脑,也称为虚拟桌面或云端桌面,是一项创新的本文将深入探讨云电脑的工作原理和特点、云电脑的优势和挑云电脑,也被称为虚拟桌面或云桌面,是一种通过网络访问的远程计算机。本文将讲解以下几个方面:1、云电脑的定义与特点;2、云电脑的工作原理与技术基础;3、云电脑的使用场景和优势;4、......
  • 如何安全彻底地删除GitHub上的fork项目
    GitHub提供了一个功能,允许用户fork其他开发者的项目,但在某些情况下,我们可能需要删除fork的项目。本文将指导您如何安全、彻底地进行此操作:1.确认删除的必要性;2.备份重要数据;3.删除项目;4.检查与原项目的联系;5.清除本地仓库。删除GitHub上的fork项目是一个相对简单的过程,但在执行之......
  • 什么是依赖注入(DI)和控制反转(IOC)
    介绍依赖注入,DependencyInjection。在说明依赖注入之前,我们先描述一个场景。玩家类依赖于武器进行攻击。在传统的编程逻辑中,代码如下。可以看到,Player玩家不仅依赖于Weapon,而且还依赖于Sword。而且可以预见的是,假如Sword剑换成枪Spear,需要重新创建一个玩家类,这会导致大量的......
  • Prometheus源码专题精讲——监控系统 Prometheus 2.x/3.x 源码阅读和分析_配置文件的
    配置文件的加载与刷新——config/config.gohttps://github.com/prometheus/prometheus/blob/v2.55.0/config/config.goPrometheus配置文件的加载过程主要可以分为以下两步:1、初始化时加载2、运行时重新加载一、初始化时加载1.1、启动时加载1.2、配置初始化二、运行时加载......
  • 需求规划说明书
    这个作业属于哪个课程班级的链接这个作业要求在哪里作业要求的链接这个作业的目标<明确项目需求分析、制定团队项目计划、总结本周推进结果>一、需求规划说明书1.面向用户分析:1.1目标用户群体:老年人及其家庭成员,用于家庭安全监控。医疗机构和护理人员,用于......
  • 深度学习领域如何正确地读取视频
    参考资料:https://github.com/dmlc/decord由于最近部门业务调整,让我过去做视频相关的研究了。这篇随笔是为了辨析一下在深度学习的语境下如何规范地去读取视频,如果不注意的话还是容易踩坑的。首先,我们需要用到decord这个软件,使用pip就可以直接安装,链接在参考资......
  • Java学习十六—掌握注解:让编程更简单
    一、关于注解1.1简介Java注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。​初学者可以这样理解注解:想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去......
  • MySQL中如何实现数据的增量更新和同步
    ​​在MySQL数据库操作中,实现数据的增量更新和同步至关重要。主要步骤包括:1.确定增量数据源与目标库;2.使用binlog进行增量数据跟踪;3.利用工具进行数据同步;4.确保同步过程的安全性;5.定期监控与验证同步准确性。首先,我们必须识别哪些数据需要进行增量更新。1.确定增量数据源与目......
  • windows安装MySQL8.4.3LTS
    windows安装MySQL8.4.3LTS第一步:下载压缩文件https://dev.mysql.com/downloads/mysql/第二步:解压压缩包以及编写配置my.ini配置[mysqld]#skip_grant_tables#设置3306端口port=3306#设置mysql的安装目录basedir=D:\\Software\\mysql-8.4.3-winx64#设置mysql数据库......
  • 2024-2025-1 20241312 《计算机基础与程序设计》第五周学习总结
    |这个作业属于哪个课程|<班级的链接>(2024-2025-1-计算机基础与程序设计)||这个作业要求在哪里|<作业要求的链接>(2024-2025-1计算机基础与程序设计第五周作业||这个作业的目标|Pep/9虚拟机机器语言与汇编语言算法与伪代码测试:黑盒,白盒||作业正文|https://www.cnblogs.com/son......