创建动态链接库时设置导出函数的方法

有两种方法1.使用模块定义文件, 2.在要导出的函数前加上 __declspec(dllexport) 

我们用VS2008新建个DLL工程,工程名为“TestDLL”

把默认的源文件后缀 .CPP改为.C(C文件)

int _stdcall MyFunction(int iVariant){return 0;
}

1. 使用传统的模块定义文件 (.def)

新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:

LIBRARY TestDllEXPORTSMyFunction

在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"

2. Visual C++ 提供的方便方法

在01行的int 前加入 __declspec(dllexport) 关键字

通过以上两种方法,我们就可以导出MyFunction函数。

我们用Dependency查看导出的函数:

第一种方法导出的函数为:

MyFunction

第二种方法导出的函数为:

_MyFunction@4

__stdcall会使导出函数名字前面加一个下划线,后面加一个@再加上参数的字节数,比如_MyFunction@4的参数(int iVariant)就是4个字节
__fastcall与 __stdcall类似,不过前面没有下划线,而是一个@,比如@MyFunction@4 
__cdecl则是始函数名。

小结:如果要导出C文件中的函数,并且不让编译器改动函数名,用def文件导出函数。

下面我们来看一下C++文件

我们用VS2008新建个DLL工程,工程名为“TestDLL”

默认的源文件后缀为 .CPP (即C++文件)。

输入测试代码如下:

01 int _stdcall MyFunction(int iVariant)

02 {

03 return 0;

04 }

为了导出上面这个函数,我们有以下几个方法:

3. 使用传统的模块定义文件 (.def)

新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:

LIBRARY TestDll

EXPORTS

MyFunction

在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"

4. Visual C++ 提供的方便方法

在01行的int 前加入 __declspec(dllexport) 关键字

通过以上两种方法,我们就可以导出MyFunction函数。

我们用Dependency查看导出的函数:

第一种方法导出的函数为:

MyFunction

第二种方法导出的函数为:

?MyFunction@@YGHH@Z

可以看到 第二种方法得到的 导出函数名 并不是我们想要的,如果在exe中用显示方法(LoadLibrary、GetProcAddress)调用 MyFunction 肯定会失败。

但是用引入库(*.LIB)的方式调用,则编译器自动处理转换函数名,所以总是没有问题。

解决这个问题的方法是:

用VC 提供的预处理指示符 “#pragma” 来指定链接选项。

如下:

#pragma comment(linker, "/EXPORT:MyFunction=?MyFunction@@YGHH@Z")

这时,就会发现导出的函数名字表中已经有了我们想要的MyFunction。但我们发现原来的那个 ?MyFunction@@YGHH@Z 函数还在,这时就可以把 __declspec() 修饰去掉,只需要 pragma 指令即可。

而且还可以使如下形式:

#pragma comment(linker, "/EXPORT:MyFunction=_MyFunction@4,PRIVATE")

PRIVATE 的作用与其在 def 文件中的作用一样。更多的#pragram请查看MSDN。

小结:如果要导出C++文件中的函数,并且不让编译器改动函数名,用def文件导出函数。

同时可以用#pragma指令(中也可以用)。

总结:

C++编译器在生成DLL时,会对导出的函数进行名字改编,并且不同的编译器使用的改编规则不一样,因此改编后的名字也是不同的(一般涉及到C++ 中的重载等)。

如果利用不同编译器分别生成DLL和访问DLL的exe程序,后者在访问该DLL的导出函数时就会出现问题。如上例中函数MyFunction在C++编译器改编后的名字是?MyFunction@@YGHH@Z。我们希望编译后的名字不发生改变,这里有几种方法。

第一种方法是通过一个称为模块定义文件DEF来解决。

LIBRARY TestDll

EXPORTS

MyFunction

LIBRARY 用来指定动态链接库内部名称。该名称与生成的动态链接库名一定要匹配,这句代码不是必须的。

EXPORTS说明了DLL将要导出的函数,以及为这些导出函数指定的符号名。

第二种是定义导出函数时加上限定符:extern "C"

如:#define DLLEXPORT_API extern "C" _declspec(dllexport)

但extern "C"只解决了C和C++语方之间调用的问题(extern “C” 是告诉编译器,让它按C的方式编译),它只能用于导出全局函数这种情况 而不能导出一个类的成员函数。

同时如果导出函数的调用约定发生改变,即使使用extern "C",编译后的函数名还是会发生改变。例如上面我们加入_stdcall关键字说明调用约定(标准调用约定,也就是WINAPI调用约定)。
#define DLLEXPORT_API extern "C" _declspec(dllexport)
01 DLLEXPORT_API int _stdcall MyFunction(int iVariant)

02 {

03 return 0;

04 }
编译后函数名MyFunction改编成了_MyFunction@4

通过第一种方法模块定义文件的方式DLL编译后导出函数名不会发生改变。

转载于:https://www.cnblogs.com/answercard/p/5042251.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript的浏览器Bom详解,window、location、history对象

BOM(BrowserObjectModel)也叫浏览器对象模型,描述与浏览器进行交互的方法和接口。BOM由多个对象组成, 其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。 JavaScript由三部分组成:ECMAScript,BOM&…

python右斜杠_Python中的左斜杠、右斜杠(正斜杠和反斜杠)

首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows(一)目录中的斜杠们python读文件需要输入的目录参…

重用生成的JAXB类

在本文中,我将演示如何利用– XJC扩展来重用以前从XML模式生成的类。 当其他XML架构导入XML架构并且您不想每次都生成相同的类时,这很有用。 导入的架构(Product.xsd) 以下XML模式代表有关产品的基本信息。 产品是此示例域中的常…

MySQL的Master/Slave群集安装和配置

本文介绍MySQL的Master/Slave群集安装和配置,版本号安装最新的稳定版GA 5.6.19。 为了支持有限HA。我们用Master/Slave读写简单孤立的集群。有限HA这是当Master不可用,数据不会丢失。但在Master写的,必须手工处理故障。假设要支持更高的可用性…

动态申请二维数组

以下是动态申请a[m][n]的源代码 代码一&#xff1a; /* 编译器&#xff1a;DEV C */ #include<stdio.h> #include<stdlib.h> int main() {int **a;int i,j,m,n;scanf("%d%d",&m,&n); a (int **)malloc(sizeof(int *)*m);for (i0;i<m; i){a[i…

判断线段和直线相交 POJ 3304

1 // 判断线段和直线相交 POJ 33042 // 思路&#xff1a;3 // 如果存在一条直线和所有线段相交&#xff0c;那么平移该直线一定可以经过线段上任意两个点&#xff0c;并且和所有线段相交。4 5 #include <cstdio>6 #include <cstring>7 #include <iostream>8 …

JavaOne正在重建动力

在JavaOne上度过了一个非常忙碌的一周&#xff0c;今年的活动有很多让人喜欢的地方。 有很多惊喜的公告&#xff0c;很多很好的内容/会议&#xff0c;并且在场地和组织上都有很多改进。 对于一直耐心等待我发表我所有演讲的人们&#xff0c;我为您的延迟表示歉意……给4个演讲一…

tensorflow http调用_《TensorFlow 内核剖析》笔记——系统架构

3 系统架构系统整体组成&#xff1a;Tensorflow的系统结构以C API为界&#xff0c;将整个系统分为前端和后端两个子系统&#xff1a;前端构造计算图后端执行计算图&#xff0c;可再细分为&#xff1a;运行时&#xff1a;提供本地模式和分布式模式计算层&#xff1a;由kernal函数…

SGU 187.Twist and whirl - want to cheat( splay )

维护一个支持翻转次数M的长度N的序列..最后输出序列.1<N<130000, 1<M<2000splay裸题...-------------------------------------------------------------#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int ma…

练习一万小时成天才

随着畅销书《异类》的流行&#xff0c;“练习一万小时成天才”这个口号现在是尽人皆知。也许仍然有不少人相信那些不世出的天才必有天生的神秘能力&#xff0c;但科学家通过大量的调查研究已经达成共识&#xff0c;那就是所有顶级高手都是练出来的。不但如此&#xff0c;最近几…

(转)数据流图

转自:http://jingyan.baidu.com/article/4f34706eefdb04e387b56deb.html 数据流图4种图元 数据流图的实例 转载于:https://www.cnblogs.com/wrencai/p/5852389.html

从CLI监视OpenJDK

目前&#xff0c;我大部分时间在Java虚拟机 &#xff08;JVM&#xff09;内或周围进行大量工作&#xff0c;大部分时间是在Linux上。 当事情变得不对劲并且我试图确定原因时&#xff0c;我接触了Java性能分析工具。 这些工具有两种形式&#xff0c;一种是精美的GUI&#xff08;…

python数据库优化_python | Mysql性能优化一

对mysql优化是一个综合性的技术&#xff0c;主要包括表的设计合理化(符合3NF)添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]分表技术(水平分割、垂直分割)读写[写: update/delete/add]分离存储过程 [模块化编程&#xff0c;可以提高速度]对mysql配…

MySQL中文乱码问题

项目中用到MySQL数据库时中文出现乱码问题&#xff08;中文字符都变成了&#xff1f;&#xff09;解决&#xff1a; 1、统一项目与数据库的编码&#xff0c;项目中用的是UTF-8因此我的把数据库的编码统一成UTF-8 修改方式&#xff1a;修改 MySQL根目录中的 my.ini 文件替换d…

json与字符串互转

1 字符串转JSON var objeval((str"))var objJSON.parse(str)var objstr.parseJSON()2 JSON转字符串 var strobj.toJSONString()var strJSON.stringify(obj)转载于:https://www.cnblogs.com/liu-xia/p/5050878.html

使用RequestFactory API进行Spring GWT集成

从GWT 2.4开始&#xff0c;将RequestFactory API与后端的Spring服务集成很容易&#xff0c;您需要做的就是在服务器上创建一个自定义ServiceLocator&#xff0c;GWT将使用它来正确定位被调用的服务&#xff1a; public class SpringServiceLocator implements ServiceLocator {…

C++实例讲解Binder通信

binder是android里面的通信机制&#xff0c;这就不说它如何如何好了&#xff0c;Goog已经说过了&#xff0c;这里不多说。binder是一个面向对象的编程方法&#xff0c;大量使用虚函数类。最近研究binder看到一网友写的&#xff0c;就借鉴一下。这个例子很好的解释里binder通信关…

2014编程之美初赛第一场

题目1 : 焦距 时间限制:2000ms单点时限:1000ms内存限制:256MB描述 一般来说&#xff0c;我们采用针孔相机模型&#xff0c;也就是认为它用到的是小孔成像原理。 在相机坐标系下&#xff0c;一般来说&#xff0c;我们用到的单位长度&#xff0c;不是“米”这样的国际单位&#x…

高中python公开课怎么上好_如何上好高中英语公开课

谈如何上好高中英语公开课对青年教师来说&#xff0c;开一节公开课&#xff0c;如同完成一次蜕变&#xff0c;累掉一层皮&#xff0c;有着刻骨铭心的阵痛&#xff0c;但换来的是突飞猛进的专业成长。可以说&#xff0c;公开课是青年教师培训的有效途径&#xff0c;是名师培养的…

Codeforces Round #261 (Div. 2) - E (459E)

题目连接&#xff1a;http://codeforces.com/contest/459/problem/E 题目大意&#xff1a;给定一张有向图&#xff0c;无自环无重边&#xff0c;每条边有一个边权&#xff0c;求最长严格上升路径长度。(1≤n&#xff0c;m≤3 *10^5) 初见此题觉得以边为点&#xff0c;以点为边&…