请问DLL 的 DEF文件有什么作用?

来源:百度文库 编辑:神马文学网 时间:2024/04/28 18:30:15
楼主yukuang(编程是我的业余爱好)2001-02-13 09:32:00 在 VC/MFC / 基础类 提问

问题点数:20、回复次数:11Top

1 楼lhxx(随风)回复于 2001-02-13 09:57:00 得分 0

DEF文件就是将DLL的函数入口导出,使程序可以正确访问  
  如果你用的是扩展的DLL就不用DLL了,否则就一定要,不然就会在调用时出现非法操作!Top

2 楼vc_boy()回复于 2001-02-13 10:00:00 得分 0

如果不在函数的定义前加上dllexport等,就要在此文件中加入要导出的函数名称Top

3 楼hide(躲在风里面)回复于 2001-02-13 10:20:00 得分 0

如果你的dll   导出函数用的是   extern   "C"     functionname  
  的话,就需要生成一个def文件来说明你的导出函数和变量。  
  如果使用   _declspec(dllexport)   来生命导出函数和变量的话,就不需要了。因为_declspec(dllexport)是microsoft   c/c++的一个新的关键字,编程程序在编程的时候,会在obj文件中加入相应的信息,连接程序在处理的时候,会分析到的Top

4 楼zzh()回复于 2001-02-13 11:06:00 得分 0

如果你使用winapi方式来定义的话,就必须手工在DEF文件中加入定义,不然,就找不到入口点,别的语言没有办法访问,如果使用_declspec(dllexport)或_declspec(dllinport)来定义的话,就不需要了。Top

5 楼yukuang(编程是我的业余爱好)回复于 2001-02-13 13:34:00 得分 0

to   lhxx(随风) :什么是扩展的DLL?Top

6 楼YuHao()回复于 2001-02-13 22:52:00 得分 0

我的经验是即使在程序中用了__declspec(dllexport),最好也用DEF文件,否则用exescope看一下输出的函数,名字完全变了!用DEF显式的定义函数名称就没有问题.Top

7 楼horris(僧推月下门)回复于 2001-02-13 23:01:00 得分 0

说的都不对!不管是用MFC还是SDK,不管用没有dllexport,DEF都是可选的。DEF的作用一是指定导出函数的序号,以使调用都可以用序号调用DLL的导出函数,否则,只能按名称调用,这样慢,而且只能使用显式引用(即在程序中用LoadLibrary,GetProcAddress等),而不能用隐式引用(象VC中使用LIB文件引用)。DEF的另一重要作用是可以指定DLL中的某些全局变量为调用进程共享,一般这些变量是每个调用进程都要生成一个的。还有别的作用我记不清了,请大家查MSDN吧。Top

8 楼horris(僧推月下门)回复于 2001-02-13 23:02:00 得分 0

补充一点,如果作Win16的应用,必须有DEF文件,这可是陈年老谷子的事了。Top

9 楼yukuang(编程是我的业余爱好)回复于 2001-02-14 09:04:00 得分 0

到底谁的对?Top

10 楼horris(僧推月下门)回复于 2001-02-14 10:19:00 得分 10

to   YuHao:名字都不对了,是C语言的命名约定,全局函数都以_开始,或者是C++语言的命名约定。我的意见是导出函数以extern   "C"   WINAPI开始,后面是函数返回值、参数等原型,不要导出C++类的成员函数,即便是静态成员函数,这样可以保证各种语言的应用都能使用。  
  谁说的对试试就行了嘛。  
  一个函数定义有二个特性与导出有关:参数压出栈顺序,命名约定,标准的Windows   DLL用_stdcall参数约定,这由WINAPI定义;extern   "C"决定了函数前加_,而不是C++的模块名+@+函数名。但是标准DLL函数名不加_,所以要让比如VB访问你的DLL,最好用.DEF文件Top

11 楼Sandyyang(雨夜街头)回复于 2001-02-18 11:17:00 得分 10

得看具体的连接器。如BCB,Delphi就不用。  
  其他大多数连接器要以他作为参考,输出导出函数名,以及一些附加信息。