DLL之def和exp文件作用

  参考:https://blog.csdn.net/lgstudyvc/article/details/7939660。 

  如何导出类及相关接口,参考https://www.codeguru.com/cpp/w-p/dll/importexportissues/article.php/c123/Explicitly-Linking-to-Classes-in-DLLs.htm,讲的很专业很详细。

exp:

     文件是指导出库文件的文件,简称导出库文件,它包含了导出函数和数据项的信息。当LIB创建一个导入库,同时它也创建一个导出库文件。如果你的程序链接到另一个程序,并且你的程序需要同时导出和导入到另一个程序中,这个时候就要使用到exp文件(LINK工具将使用EXP文件来创建动态链接库)。

def:

     def文件的作用即是,告知编译器不要以microsoft编译器的方式处理函数名,而以指定的某方式编译导出函数(比如有函数func,让编译器处理后函数名仍为func)。这样,就可以避免由于microsoft VC++编译器的独特处理方式而引起的链接错误。

说明:
.def文件的规则为:
  (1)LIBRARY语句说明.def文件相应的DLL;
  (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
  (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
————————————————

Dll导出函数和类的方法有三种:

1.    源代码中的 __declspec(dllexport)

2.    .def 文件中的 EXPORTS 语句

3.    LINK 命令中的 /EXPORT 规范

所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

三者的不同之处:__declspec(dllexport)导出变量方法类很简单,也可以指定C类型约定导出(加extern “C”),但是如果你的DLL是供VB、 PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:

    __declspec(dllexport) int __stdcall IsWinNT()

    会转换为IsWinNT@0,这样你在VB中必须这样声明:

    Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long

    @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

.def文件是模块定义文件,使用.def文件可以DLL 导出函数,也可以通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。

LINK 命令中的 /EXPORT 规范是通过预处理指示符 “#pragma” 来指定链接选项来快捷导出DLL函数,比如:

#pragma comment(linker, "/EXPORT:MyExportFunction=_MyExportFunction@4,PRIVATE")

posted @ 2019-11-18 20:56  傍风无意  阅读(1744)  评论(0编辑  收藏  举报