Windows/MFC_dll生成文件___浅谈def文件(用于生成dll)

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++修饰过的函数名,看起来真得很可怕,太长了。

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

还有一个比较关键的因素是函数的调用约定,它规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题,C++默认的抵用约定是__cdecl这种类型的,典型的printf这种可变参数就是依赖了这种调用方式,此外还有其他几种调用约定,这里就不细说了。

 

明白了上面2个问题,这时候引出新的问题,为了使其他语言(VBPascal什么的)可以使用VC编写的dll,因为VBC++的函数调用约定是不同的,那么就有问题,首先是函数名修饰规则不一样,VB调用函数function的时候就会提示找不到所引用的函数,因为dll中的函数名是_function@,这时候就引入def文件,他能指定导出dll的时候函数名,例如我在咱1.48客户端找到D3D的渲染dll,有个def文件叫OgreD3D9RenderSystem.def ,里面有这样的语句

 

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

 

LIBRARY RenderSystem_Direct3D9

EXPORTS 

         dllStartPlugin @1

         dllStopPlugin @2

 

按照我的理解,应该存在一个名字为RenderSystem_Direct3D9.dll的文件,而里面有名字为dllStartPlugindllStopPlugin两个导出函数,果然在1.48的文件夹下搜索到了这个dll,用dumpbin工具查看里面的导出函数,看到了如下的结果

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

ordinal hint RVA      name

      1    0 00002D80 dllStartPlugin

      2    1 00002E40 dllStopPlugin

 

这下明白了def文件的作用。

在网上看到了这样的描述,使用def文件来输出函数的一个主要目的就是:将编译器生成的函数修饰去掉,用更加自然、更加容易理解、更加容易记忆的名字来命名函数,而不是一串让人一看就吓一跳的修饰名字。

客户端就是C++编码,也没有什么别的语言来调用了?为什么还要这么弄呢?也是在网上看的,他这么说:“写动态库要着眼于‘大局’, 要一切符合‘标准’,什么是‘大局’?大局就是走可持续发展道路,就是复用。“

以上是今天自己的一点看法,还不是很清楚再什么时候用def文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值