使用def文件简化dll导出

转载 2015年11月20日 14:57:45

在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如:

    _declspec(dllexport) int add(int a, int b);

在这种方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的。但是,如果调用该dll是一个其它语言的程序(如C#、VB),则会出错。究其原因,是因为在C++中存在函数的重载,允许函数重名,因此在编译器生成dll的时候,为了区别重名的程序,会将其进行一定算法进行名称转换。例如,对于前面的add函数,实际的函数名称是如下形式。

    

因此,我们直接通过函数名add是无法找到该函数的,从而导致调用失败。为了解决这一问题,我们往往在函数前面再加一个extern "C"使用C方式的函数命名规则。

    extern "C" _declspec(dllexport) int add(int a, int b);

这样函数的名称就成add了。

    

这样,我们就需要在每一个函数签名加上"extern "C" _declspec(dllexport)"这一长串声明。如果需要导出的函数较多则显得非常繁琐,也非常难看。为了简化这一过程,MS引入了def文件方便我们操作。

使用Def文件比较简单,只需要在项目中添加一个def文件,然后把我们要导出的函数放在def文件中即可。

    

Def文件的简单示例如下:

    LIBRARY
    EXPORTS
        add

最后记得在链接器选项中选中使用的def文件(默认情况下,添加def文件时会自动加上该选项,无需手动更改)。

    

这样,我们的函数无需加那一堆前缀,仍然可以使用默认的int add(int a, int b);形式,但导出后的方式然是C形式的函数定义。

    

最后指得一提的是,一般C/C++默认的调用方式是__cdecl,这种方式下需要调用方对函数清栈。如果对外提供api共其它非C++程序使用时,调用方会无法清栈而出错(C#会直接报函数声明不匹配的错误)。因此,对外提供api时还应该将接口声明为__stdcall,让api函数自己清栈。这也是Windows API前面都加上了一个WINAPI的宏的原因。

def文件还有许多其它的高级用法,要进一步了解的话,可以参看一下MS的官方文档:

http://msdn.microsoft.com/zh-cn/library/28d6s79h(v=vs.80).aspx

相关文章推荐

使用 DEF (模块定义) 文件从 DLL 导出函数和类

块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。 它可以在不同的编译器上面用相同的名字, 如果不使用 __declspec(dll...
  • gxp
  • gxp
  • 2011年11月30日 11:59
  • 1130

使用Def文件导出dll

前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll。其实我们还有另一种方法来导出dll。 先介绍参考文献: 1.dll导...

使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

转载地址:http://www.2cto.com/kf/201303/197199.html 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不...
  • blacet
  • blacet
  • 2015年11月02日 10:07
  • 1530

使用 DEF 文件导出 DLL

原文出自:www.fishc.com   模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport)...

使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

参考网址:http://blog.csdn.net/blacet/article/details/49583169 http://blog.csdn.net/windows_nt/article/d...

使用Def文件导出Dll文件

本文介绍如何使用Def文件制作DLL。     模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexp...

使用Def文件导出Dll文件

本文介绍如何使用Def文件制作DLL。     模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dll...
  • slj_win
  • slj_win
  • 2014年06月19日 10:02
  • 389

[DLL]使用def文件从dll导出

模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要...

用DEF文件从DLL中导出C++类

用『DEF从DLL导出一个函数』,或用『_declspec(dllexport)指令从DLL中导出类』,想必大家已经很熟悉了,也经常使用着。这里向大家介绍一种用『DEF文件从DLL导出一个类』的方法。...
  • lsieun
  • lsieun
  • 2012年06月06日 13:41
  • 435

dll的def文件与__declspec(dllexport)导出函数方式比较

dll的def文件与__declspec(dllexport)导出函数方式比较 【__declspec(dllexport) 方式】 首先对C和C++编译(extern...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用def文件简化dll导出
举报原因:
原因补充:

(最多只允许输入30个字)