文档章节

dllimport&dllexport

guoliang
 guoliang
发布于 2015/06/11 13:02
字数 405
阅读 40
收藏 0
点赞 0
评论 0

在利用DLL动态链接库的项目中,经常要用到dllexport和dllimport。我们这里把产生DLL的项目称作导出项目,把使用DLL的项目称作导入项目。


因为在导出项目和导入项目中,我们要分别使用dllexport和dllimport来定义我们的函数,比如:


在导出项目中,头文件要写成这个样子:

__declspec(dllexport) void showMessage(){
//...
}
而在导入项目中,头文件要写成这个样子:
__declspec(dllimport) void showMessage(){
//...
}


所以为了使导出项目和导入项目都使用同一个头文件,我们需要使用如下的方法来定义:


#ifdef SIMPLEDLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
然后再在导出项目的预处理器中定义SIMPLEDLL_EXPORT;而在导入项目中则不需要任何定义。


另外:


__declspec(dllimport)如果不定义的话,在导入项目中也可以正常使用,但是有以下两个问题:
1. dllimport会对编译的汇编代码做优化,将间接调用变为直接调用。如下:

//如果不使用__declspec(dllimport)
call showMessage
showMessage:  jmp dword ptr __imp_showMessage
//如果使用 __declspec(dllimport)
call dword ptr __imp_showMessage

注意showMessage是我们头文件中定义的符号,而DLL导出项目中定义的实际符号是__imp_showMessage。所以对于不加dllimport,编译器无法区分是普通函数还是导入函数。而加了的话,编译器知道这是一个导入函数,就能自动调用__imp_showMessage


2.对于要导入的静态变量,必须使用dllimport来描述,否则会出现找不到符号的情况。




© 著作权归作者所有

共有 人打赏支持
guoliang
粉丝 26
博文 115
码字总数 27457
作品 0
杭州
程序员

暂无文章

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
37分钟前
9
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部