
_declspec(dllimport)到底有什么用?(转载)
发布日期:2021-05-09 00:20:55
浏览次数:20
分类:博客文章
本文共 1418 字,大约阅读时间需要 4 分钟。
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)#endifclass 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这个关键字,这里体现了一种对称美。
参考文章:
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月25日 04时24分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
#VERDI# 关于Verdi使用的几个常用技巧整理
2023-01-23
@Resource注解的使用
2023-01-23
@ResponseBody 和 @RequestBody
2023-01-23
A + B 九度oj
2023-01-23
A20地址线
2023-01-23
abaqus质量缩放系数取值_ABAQUS的质量缩放
2023-01-23
Accessibility
2023-01-23
08-信息收集之端口收集(总结版)
2023-01-23
15种下载文件的方法&文件下载方法汇总&超大文件下载
2023-01-23
anaconda、python卸载后重装以及anaconda--443
2023-01-23
AWVS工具太顶了,漏洞扫描工具AWVS介绍及安装教程
2023-01-23
CentOS 系列:CentOS 7文件系统的组成
2023-01-23
CSDN----Markdown编辑器
2023-01-23
Docker容器进入的4种方式(推荐最后一种)
2023-01-23
Docker部署postgresql-11以及主从配置
2023-01-23