首页 技术 正文
技术 2022年11月20日
0 收藏 963 点赞 4,463 浏览 964 个字

1. 用法

在 VS 的“预编译”选项里定义_EXPORTING宏

#ifdef _EXPORTING
#define API_DECLSPEC __declspec(dllexport)
#else
#define API_DECLSPEC __declspec(dllimport)
#endif

API_DECLSPEC void HelloWorld();</pre>

2. 作用

2.1.

__declspec(dllexport)用于导出符号,也就是定义该函数的dll;__declspec(dllimport)用于导入,也就是使用该函数。

因为这个头文件既要被定义该函数的dll包含,也要被使用该函数的程序包含,当被前者包含时我们希望使用 __declspec(dllexport) 定义函数,当被后者包含时我们希望使用 dllimport。

2.2.

假设你的A(EXE或DLL)需要调用B(DLL)中的某个导出函数:__declspec(dllexport) void HelloWorld();

不用宏,在项目A中直接包含这个头文件,编译、运行……OK。

打开Dependency Walker(其它合适的工具也可以),打开A(.EXE或.DLL)文件,在左边树中选择根节点,A文件也有导出符号”HelloWorld”

2.3.

不使用 declspec(dllimport) 也能正确编译代码,但使用 declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

2.4.

导入全局、静态或者类成员变量需要__declspec(dllimport)。

#define DllImport __declspec(dllimport)
DllImport int j;

__declspec(dllexport)是用于避免需要自己写 DEF 文件的。编译器会为被declspec(dllexport)修饰的函数自动添加一个导出函数入口。如果你在其他模块中包含 declspec(dllexport)的头文件,这些项目的导出表中也会生成一个同名导出函数。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905