_declspec(dllimport)到底有什么用?(转载)

2024-02-03 20:58

本文主要是介绍_declspec(dllimport)到底有什么用?(转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 在导入动态链接库中的全局变量方面起作用:
使用类似#ifdef _EXPORTING
#define API_DECLSPEC __declspec(dllexport)
#else
#define API_DECLSPEC __declspec(dllimport)
#endif可以更好地导出dll中的全局变量,比如按照的宏,可以在dll中这样导出全局变量:API_DECLSPEC CBtt g_Btt;然后在调用程序这样导入:API_DECLSPEC CBtt g_Btt;当然也可以使用extern关键字,比如在dll中这样导出全局变量:CBtt g_Btt;然后在调用程序这样导入:extern CBtt g_Btt;但据说使用__declspec(dllimport)更有效。2. __declspec(dllimport)的作用主要体现在导出类的静态成员方面,
比如在动态链接库中定义这样一个导出类:class __declspec(dllexport) CBtt
{
public:
CBtt(void);
~CBtt(void);
public:
CString m_str;
static int GetValue()
{
return m_nValue;
}
private:
static int m_nValue;
};照上面这样声明,外部虽然可以使用CBtt类,但不能使用CBtt类的GetValue函数,一使用就会出现无法解析的外部符号 "public: static int CBtt::m_nValue" (?m_nValue@CBtt@@2HA)。只有如下声明才能使用CBtt类的GetValue函数:#ifdef _EXPORTING
#define API_DECLSPEC __declspec(dllexport)
#else
#define API_DECLSPEC __declspec(dllimport)
#endif
class API_DECLSPEC CBtt
{
public:
CBtt(void);
~CBtt(void);
public:
CString m_str;
static int GetValue()
{
return m_nValue;
}
private:
static int m_nValue;
};3. 使用隐式使用dll时,不加__declspec(dllimport)完全可以,使用上没什么区别,只是在生成的二进制代码上稍微有点效率损失。a、 不加__declspec(dllimport)时,在使用dll中的函数时,编译器并不能区别这是个普通函数,还是从其它dll里导入的函数,所以其生 成的代码如下:call 地址1地址1:
jmp 实际函数地址b、有 __declspec(dllimport)时,编译器知道这是要从外部dll导入的函数,从而在生成的exe的输入表里留有该项,以便在运行 exe,PE载入器加载exe时对输入地址表IAT进行填写,这样生成的代码如下:call dword ptr[输入表里哪项对应的内存地址] (注意:现在就不需要jmp stub了)。这里
有兴趣的朋友可以参看《编译原理》和 PE文件格式。4.使用__declspec(dllimport)体现了语言的一种对称美,比如虽然!true就是表示false,但是我们还是需要false这个关键字,这里体现了一种对称美。

参考文章:https://blog.csdn.net/mniwc/article/details/7993361

这篇关于_declspec(dllimport)到底有什么用?(转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675393

相关文章

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

提问的智慧(转载)

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~   ---------------------------------      在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。       首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本,有图有真相: 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动:zram,我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑,完整梳理完这个逻辑将对Linux块设备驱动模型有深入的理解。 zram驱动加载的时候会调用zram_add函数,源码如下: 1887/*1888 * Allocate and initia

MVVM到底是什么

MVVM到底是什么 文章目录 MVVM到底是什么一、MVVM是什么二、为什么这么定义1. 分离关注点2. 提高可维护性3. 数据绑定和事件驱动4. 支持前端框架的发展 三、底层逻辑1. ViewModel层2. 数据绑定3. 事件驱动4. 响应式系统 四、扩展与高级技巧1. 组件化开发2. 双向数据绑定3. 计算属性和侦听器4. 插槽

我们在学习Spark的时候,到底在学习什么?

我必须要说,Spark这个框架出现之前,我对很多大数据领域的框架源码甚至都是嗤之以鼻的。 很多小伙伴在群里或者私信留言问我关于Spark的学习路径问题。 Spark发展至今,应该说已经非常成熟了。是大数据计算领域不得不学习的框架。尤其是Spark在稳定性和社区发展的成熟度方面,基本可以吊打其他的大数据处理框架。 我之前发过一篇关于阅读Spark源码的文章:《Spark源码阅读的正确打开方式》

【硬刚大数据】我们在学习Flink的时候,到底在学习什么?

⭐⭐欢迎关注博客主页:https://blog.csdn.net/u013411339 ⭐⭐欢迎点赞 👍 收藏 ⭐留言 📝 ,欢迎留言交流! ⭐⭐本文由【王知无】原创,首发于 CSDN博客! ⭐⭐本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 这是一篇指南和大纲性质的文章。

【硬刚大数据】我们在学习Spark的时候,到底在学习什么?

欢迎关注博客主页:https://blog.csdn.net/u013411339 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 CSDN博客!本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 很多小伙伴在群里或者私信留言问我关于Spark的学习路径问题。

WIFI贴项目到底是不是“骗局”呢?由我来揭秘!

各位亲爱的朋友们,大家好!我是你们的老朋友鲸天科技千千,一直在这片互联网的热土上耕耘。相信你们对我都不会陌生,因为我常常分享一些互联网上的新奇项目和实用技巧。如果你对我的内容感兴趣,别忘了点个关注哦! 首先很多人交了几千几万的学费入局,我想说你真的被割韭菜了,这个项目本身没什么技术性,都是赚广告收益,收加盟代理费就是在割韭菜,共享经济本身互利互惠,推广员在赚的同时公司也在其中谋利。 共享WiF