最近编写动态库遇到的很诡异的问题,各位大牛给解释一下呗。

senses1 2011-09-27 09:57:52
最近在集成一个语音识别库的时候碰到了这样一个问题:
同样的代码,在两个开发平台编译生成dll之后,dll文件大小不同,而且小的文件可以在调试机中正常运行,大的在调试机中被调用的时候就会出现内存访问违例。
开发环境都是vc 6.0enterprise +windowsXP 5.1 2600
导出的makefile文件经过对比都一样,
我有点怀疑是其中的_UNICODE参数搞的鬼,因为编译的时候只有这个参数是我们后改的参数。
有个_stprintf函数里边使用了这个参数编译才避免编译不通过的问题。
下边贴上dll的dump,看看是不是哪有啥问题。
大文件 主机A
File Type: DLL

Section contains the following exports for ESRLib.dll

00000000 characteristics
4E801D6D time date stamp Mon Sep 26 14:36:29 2011
0.00 version
1 ordinal base
4 number of functions
4 number of names

ordinal hint RVA name

1 0 000010C3 ?ExitESR@@YAXXZ = @ILT+190(?ExitESR@@YAXXZ)
2 1 000010C8 ?PauseESR@@YAXXZ = @ILT+195(?PauseESR@@YAXXZ)
3 2 00001019 ?ResumeEsr@@YAXXZ = @ILT+20(?ResumeEsr@@YAXXZ)
4 3 00001041 ?initESR@@YAXP6AXIJ@Z@Z = @ILT+60(?initESR@@YAXP6AXIJ@Z@Z)

Summary

C000 .data
1000 .idata
37000 .rdata
5000 .reloc
A6000 .text


小文件 主机B

File Type: DLL

Section contains the following exports for ESRLib.dll

00000000 characteristics
4E812D0E time date stamp Tue Sep 27 09:55:26 2011
0.00 version
1 ordinal base
4 number of functions
4 number of names

ordinal hint RVA name

1 0 000010C3 ?ExitESR@@YAXXZ
2 1 000010C8 ?PauseESR@@YAXXZ
3 2 00001019 ?ResumeEsr@@YAXXZ
4 3 00001041 ?initESR@@YAXP6AXIJ@Z@Z

Summary

9000 .data
1000 .idata
37000 .rdata
5000 .reloc
A3000 .text
...全文
135 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
senses1 2011-09-30
  • 打赏
  • 举报
回复
咋没人再给讲解一下呢?我顶一下
senses1 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]
_stprintf
这个函数有问题,当里面有字符串参数时,如果比较大(好像2K左右)就不正确了。
[/Quote]
如果这个函数有些问题的话,那么哪个函数可以代替这个函数使用呢?
senses1 2011-09-28
  • 打赏
  • 举报
回复
我仍然有点迷惑,能不能从dump出来的DLL信息对比一下,不同呢?
因为同样的代码编译出来文件体积小一些的dll就可以正常运行啊,大一些的文件有什么乱七八糟的东西跟在函数后边。
用户 昵称 2011-09-27
  • 打赏
  • 举报
回复
_stprintf
这个函数有问题,当里面有字符串参数时,如果比较大(好像2K左右)就不正确了。
oyljerry 2011-09-27
  • 打赏
  • 举报
回复
UNICODE字符集会影响编码格式.调用的时候要注意转换等

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧