免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 38303 | 回复: 11
打印 上一主题 下一主题

什么是DEF文件,如何编写呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-19 17:27 |只看该作者 |倒序浏览
20可用积分
最近公司要求利用SilkTest来编写自动化测试工具,但发现SilkTest无法识别一个DLL文件,感觉原因在于这个DLL文件的输出函数的格式不能够被SilkTest所理解。

所以使用Dll Export Viewer查看了一下,所有的出口函数都是下面这种格式

?writeXMLFile@CArkPolicyXMLParser@@QAE_NPAVCArkPolicy@@PBGPAG@Z

红色的是类成员函数名,而蓝色的是类名,后面的我也不清楚是什么。

感觉SilkTest只能识别C语言模式下的那种直接的出口函数名,而C++对出口函数的格式作了一定的修改。公司要求让我写一个DEF文件来做这种格式转换,能说说这种格式该怎么转换吗?而且这个dll种有上百个文件,有没有什么办法可以自动生成这个DEF文件呢?

我最开始的想法是用“extern C"的方式来是生成的DLL文件满足C语言编写的DLL文件的格式,不知道这种方法可行吗?

非常感谢!

最佳答案

查看完整内容

你的这样的DLL应该是扩展的DLL,即输出的是类方法而不是简单的函数,用高版本的Depends看,按下工具条上的C++按钮(Undecorate C++ Functions)可以那串字符翻译成类的方法(我的2.1.3790的就可以)

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2008-09-19 17:27 |只看该作者
你的这样的DLL应该是扩展的DLL,即输出的是类方法而不是简单的函数,用高版本的Depends看,按下工具条上的C++按钮(Undecorate C++ Functions)可以那串字符翻译成类的方法(我的2.1.3790的就可以)

论坛徽章:
0
3 [报告]
发表于 2008-09-19 17:33 |只看该作者
希望有帮助
Visual C++ 概念:生成 C/C++ 程序
模块定义 (.def) 文件

模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将 __declspec(dllexport) 用作指定导出函数的手段。

在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。

如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。

有关更多信息,请参见下列章节:

    *

      模块定义语句的规则
    *

      EXPORTS
    *

      HEAPSIZE
    *

      LIBRARY
    *

      NAME
    *

      SECTIONS
    *

      STACKSIZE
    *

      STUB
    *

      VERSION
    *

      保留字

请参见
参考
链接器选项
有关生成的常见问题
其他资源
C/C++ 生成参考
http://msdn.microsoft.com/zh-cn/library/28d6s79h(VS.80).aspx

论坛徽章:
0
4 [报告]
发表于 2008-09-19 17:37 |只看该作者
DEF文件还是很简单的,先举一个简单的例子(取决我的一个项目文件):

  1. ; AIDemo_CPP.def
  2. ; 该文件定义了DLL要导出的函数接口名

  3. LIBRARY        "AIDemo_CPP"

  4. EXPORTS
  5.     AI_Create             @1
  6.     AI_Destroy            @2
  7.     AI_Init               @3
  8.     AI_SetDepth           @4
  9.     AI_SetTimeLimit       @5
  10.     AI_PlaceChessman      @6
  11.     AI_Play               @7
  12.     AI_IsFull             @8
  13.     AI_IsWin              @9
  14.     AI_QuerySituation     @10
  15.     AI_QueryAuthorInfo    @11
  16.     AI_QueryAIInfo        @12

  17. ; Ok, over
复制代码


具体用法请参考这篇文章:http://blog.chinaunix.net/u/18517/showart_309975.html

论坛徽章:
0
5 [报告]
发表于 2008-09-19 17:50 |只看该作者
谢谢,我好好研究一下怎么把C++风格的转换成C风格的DEF文件。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2008-09-19 17:59 |只看该作者
DLL中用来定义给用户使用的API时,可以写一个.def文件

论坛徽章:
0
7 [报告]
发表于 2008-09-19 21:15 |只看该作者
原帖由 Godbach 于 2008-9-19 17:59 发表
DLL中用来定义给用户使用的API时,可以写一个.def文件

我知道的有三种方式
1.
#ifndef __DELAYLOADLIB_H__
#define __DELAYLOADLIB_H__

#ifdef DELAYLOADLIB_EXPORTS
#    define DELAYLOADLIBAPI __declspec(dllexport)
#else
#    define DELAYLOADLIBAPI __declspec(dllimport)
#endif /* DELAYLOADLIB_EXPORTS */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
DELAYLOADLIBAPI int fnLib();
DELAYLOADLIBAPI int fnLib2();
#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __DELAYLOADLIB_H__ */


2. 写def用lib /def[:filename]命令处理

3. 在IDE的link选项指定def文件

def的目的是为了使用lib工具产生dll的引入库 供客户端编译时使用

[ 本帖最后由 blizzard213 于 2008-9-19 21:17 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-09-22 15:46 |只看该作者
看来我最初没有把这个问题理解清楚。

问题在于Silktest只支持标准的windows DLL. 但是通过DLL Export Viewer看到的格式并不是标准的Windows DLL(具体是什么格式我也不清楚), 下面是几个例子。

?writeXMLFile@CArkPolicyXMLParser@@QAE_NPAVCArkPolicy@@PBGPAG@Z       
?writeTraceAndSetiReturn@CArkPolicyRule@@AAEXAAHIPAVCArkPolicyImplementedStrategy@@H@Z       
?writeToTrace@CArkPolicyRule@@AAEX_NPAPAVCArkPolicyVolumeInformation@@PAG220@Z       

问题是怎么把这种格式的地址转换成标准的windows DLL. 开始我想在函数的声明前加上extern c, 但是同事说这样更麻烦,不太可行,所以他推荐把这个DLL文件再包装成COM。

大家有什么简便一点的方法吗?

谢谢!

论坛徽章:
0
9 [报告]
发表于 2008-09-22 16:47 |只看该作者
谢谢

可以看到对应的类的成员函数是什么。

不知道有没有什么办法可以将这种扩展的DLL转换成标准的DLL, 好像SilkTest这种测试工具只能识别标准的DLL

论坛徽章:
0
10 [报告]
发表于 2008-10-17 17:23 |只看该作者
原帖由 blizzard213 于 2008-9-19 21:15 发表

我知道的有三种方式
1.
#ifndef __DELAYLOADLIB_H__
#define __DELAYLOADLIB_H__

#ifdef DELAYLOADLIB_EXPORTS
#    define DELAYLOADLIBAPI __declspec(dllexport)
#else
#&#1 ...

那为什么在linux上面不用使用.def呢? -l<lib的名字>就通过了,不需要再写什么文件。
那么.def存在的意义是什么? 为了不用在主程序里面再去声明一下库里面的函数供使用?

谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP