使用 DEF 文件导出 DLL

转载 2012年03月25日 11:17:50

原文出自:www.fishc.com

 

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

.def 文件必须至少包含下列模块定义语句:

  • 文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。

  • EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。

例如,包含实现二进制搜索树的代码的 DLL 看上去可能像下面这样:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3

   Min   @4


如果使用 MFC DLL 向导创建 MFC DLL,则向导将为您创建主干 .def 文件并将其自动添加到项目中。添加要导出到此文件的函数名。对于非 MFC DLL,必须亲自创建 .def 文件并将其添加到项目中。

如果导出 C++ 文件中的函数,必须将修饰名放到 .def 文件中,或者通过使用外部“C”定义具有标准 C 链接的导出函数。如果需要将修饰名放到 .def 文件中,则可以通过使用 DUMPBIN 工具或 /MAP 链接器选项来获取修饰名。请注意,编译器产生的修饰名是编译器特定的。如果将 Visual C++ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C++ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。


如果生成扩展 DLL 并使用 .def 文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:

#undef AFX_DATA

#define AFX_DATA AFX_EXT_DATA

// <body of your header file>

#undef AFX_DATA

#define AFX_DATA


这些代码行确保内部使用的 MFC 变量或添加到类的变量是从扩展 DLL 导出(或导入)的。例如,当使用DECLARE_DYNAMIC 派生类时,该宏扩展以将 CRuntimeClass 成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接 DLL,或在客户端应用程序链接到 DLL 时导致错误。


当生成 DLL 时,链接器使用 .def 文件创建导出 (.exp) 文件和导入库 (.lib) 文件。然后,链接器使用导出文件生成 DLL 文件。隐式链接到 DLL 的可执行文件在生成时链接到导入库。


请注意,MFC 本身使用 .def 文件从 MFCx0.dll 导出函数和类。

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

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

使用def文件简化dll导出

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

使用def文件简化dll导出

转载地址:https://www.cnblogs.com/TianFang/archive/2013/05/04/3059073.html 在C++中,我们可以通过 __declspec(dll...

使用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
  • 1615

使用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
  • 396

[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
  • 444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 DEF 文件导出 DLL
举报原因:
原因补充:

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