def文件格式(DLL导出)
来源:互联网 发布:怎么查ftp的端口号 编辑:程序博客网 时间:2024/06/05 20:33
http://hsw625728.blog.163.com/blog/static/39570728200911393741467/
今天接触了def文件,在客户端工程里有不少def文件,有关dll导出的今天就花时间看了看,以前包括现在自己在使用dll的时候很少用到dll一个强大功能,就是跨语言,用vb做界面调用vc写的dll各取所长。以前没碰到过def这个文件,就上网看了看,看完后明白了大概的作用。
为了实现C++语言的函数重载、运算符重载之类的高级特性,因为函数重载的时候不同的函数公用一个相同的函数名,所以编译器就使用了名称修饰对不同函数进行名字修饰用以区分各个函数。例如C的函数void function();这个函数被编译器编译后名字就成了_function@这个样子了,所以导出dll的时候函数名就是 _function@,C++为了实现重载这些高级特性修饰规则会更复杂,这就不多说了。这里有个C++修饰过的函数名,看起来真得很可怕,太长了。
还有一个比较关键的因素是函数的调用约定,它规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题,C++默认的抵用约定是__cdecl这种类型的,典型的printf这种可变参数就是依赖了这种调用方式,此外还有其他几种调用约定,这里就不细说了。
明白了上面2个问题,这时候引出新的问题,为了使其他语言(VB、Pascal什么的)可以使用VC编写的dll,因为VB和C++的函数调用约定是不同的,那么就有问题,首先是函数名修饰规则不一样,VB调用函数function的时候就会提示找不到所引用的函数,因为dll中的函数名是_function@,这时候就引入def文件,他能指定导出dll的时候函数名,例如我在咱1.48客户端找到D3D的渲染dll,有个def文件叫OgreD3D9RenderSystem.def,里面有这样的语句
LIBRARY RenderSystem_Direct3D9
EXPORTS
dllStartPlugin @1
dllStopPlugin @2
按照我的理解,应该存在一个名字为RenderSystem_Direct3D9.dll的文件,而里面有名字为dllStartPlugin和dllStopPlugin两个导出函数,果然在1.48的文件夹下搜索到了这个dll,用dumpbin工具查看里面的导出函数,看到了如下的结果
ordinal hint RVA name
1 0 00002D80 dllStartPlugin
2 1 00002E40 dllStopPlugin
这下明白了def文件的作用。
在网上看到了这样的描述,使用def文件来输出函数的一个主要目的就是:将编译器生成的函数修饰去掉,用更加自然、更加容易理解、更加容易记忆的名字来命名函数,而不是一串让人一看就吓一跳的修饰名字。
客户端就是C++编码,也没有什么别的语言来调用了?为什么还要这么弄呢?也是在网上看的,他这么说:“写动态库要着眼于‘大局’,要一切符合‘标准’,什么是‘大局’?大局就是走可持续发展道路,就是复用。“
以上是今天自己的一点看法,还不是很清楚再什么时候用def文件。
- def文件格式(DLL导出)
- MFC dll .def文件格式说明(解析)
- 使用 DEF 文件导出 DLL
- 使用 DEF 文件导出 DLL
- 使用Def文件导出dll
- EXE导出函数及def文件格式说明
- [DLL]使用def文件从dll导出
- 用.DEF文件导出DLL中的函数
- 用.DEF文件导出DLL中的函数
- 使用Def文件导出Dll文件
- dll 导出文件不能使用def文件
- DEF文件中导出DLL函数
- 使用Def文件导出Dll文件
- 使用def文件简化dll导出
- 使用Def文件导出Dll文件
- 使用Def文件导出Dll文件
- 使用def文件简化dll导出
- def文件 导出dll重载函数
- JXL和POI操作Excel有何不同呢?
- 使用PL/SQL执行OS命令
- 软件zentao--禅道安装(wamp+禅道源码包)
- MFC创建模态对话框与非模态对话框 DoModal Invalidate
- 大数据的实时处理STORM简介
- def文件格式(DLL导出)
- MyEclipse共享项目到SVN服务器 .
- linux 下 C 编程和make的方法 (五、准备写C代码)
- cgroup学习(七)——cpu子系统 && (八)——CPUSET子系统
- java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
- GPS定位过程
- hdu 1025 Constructing Roads In JGShining's Kingdom(树状数组求最长上升子序列)
- hdu 3711
- Visual Studio VS2010统计代码行数