Windows/MFC_dll生成文件___浅谈def文件(用于生成dll)
2015-09-10 21:12
369 查看
def文件格式(DLL导出)2009-12-03 21:37:41| 分类: C++ |举报|字号 订阅 今天接触了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文件。 |
相关文章推荐
- tomcat 配置数据源和连接池
- js实现文字拖动
- Fckeditor用法
- Jackson如何使JSON输出变得优雅?
- Android(java)学习笔记225:Activity与Task的4种启动模式
- Android中EditText,Button等控件的设置
- nyoj 523 亡命逃窜 【bfs】
- UIApplication 的学习总结
- COCI CONTEST #3 29.11.2014 T4 HONI
- COCI CONTEST #3 29.11.2014 T3 SILUETA
- Android Studio---ButterKnife
- 主动缓和,化干戈为玉帛
- 删除字符串中多余的空格
- BZOJ 1934 [Shoi2007]Vote 善意的投票 最小割
- java虚拟机Class格式与指令
- lintcode-最长公共子序列-77
- COCI CONTEST #3 29.11.2014 T2 DOM
- 【LeetCode】Simplify Path 解题报告
- web workers简介
- COCI CONTEST #3 29.11.2014 T1 STROJOPIS