• 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发

求助关于C++ builder 和 VC的兼容性问题

DontKissBossAss 2012-07-27 01:24:51
现在有一个c++Builder程序A, 其源代码在下述实验中不做改变。

A 调用VS编译生成的 dll B, B有两个版本 B1 和B2. B2 比B1在导出函数方面有所改变,比如删除或者增加了一些导出函数。
但是其中,A调用的导出函数在B1 和 B2中均有导出。


现在发现有如下现象,很是怪异。

A 在编译时使用B1.lib, 编译的A.exe程序调用B1.dll时正常工作,调用B2.dll时,A.exe会抛出异常。
A 在编译时使用B2.lib, 编译的A.exe程序调用B2.dll时工作正常,调用B1.dll时,A.exe会抛出异常。

(B1.lib 和 B2.lib 均为IMPLIB.EXE将B1.dll 和 B2.dll转换后的lib库,以供BCB编译的程序使用)

求解 这是为啥。

...全文
127 点赞 收藏 7
写回复
7 条回复
BORLANDSUN 2012年07月30日
[Quote=引用 3 楼 的回复:]
楼上正解,这就是所谓的DLL Hell
[/Quote]
DLL HELL据目测不是指这个吧。。。
回复 点赞
fxworld 2012年07月27日
所以建议你动态调用啊,这样,你愿意咋改都行。
回复 点赞
DontKissBossAss 2012年07月27日
[Quote=引用 4 楼 的回复:]

vc调用就可以不一致啊。 这个事情么,超级好。 但是我第一次知道。无语啊。

那么也就是说,如果我删除了导出序号在中间的函数, 为了保持这种兼容性,我不能删除这个函数,只能返回错误了?
[/Quote]

新增的函数只能是在序号后加了是吧。
回复 点赞
DontKissBossAss 2012年07月27日
vc调用就可以不一致啊。 这个事情么,超级好。 但是我第一次知道。无语啊。

那么也就是说,如果我删除了导出序号在中间的函数, 为了保持这种兼容性,我不能删除这个函数,只能返回错误了?
回复 点赞
dataxdata 2012年07月27日
楼上正解,这就是所谓的DLL Hell
回复 点赞
fxworld 2012年07月27日
如果用静态调用的话,B1.dll和B2.dll的函数序号必须是一致的,要不然用Vc同样出错。
回复 点赞
fxworld 2012年07月27日
这个出错很正常了,你用B1.lib去调用b2.dll或者B2.lib调用B1.lib,导出函数的地址不一致造成的。

改用动态调用即可:

LoadLibary(),GetProcAddress().
回复 点赞
发动态
发帖子
C++ Builder
创建于2007-08-02

2563

社区成员

10.2w+

社区内容

C++ Builder相关内容讨论区
社区公告
暂无公告