求助关于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编译的程序使用)

求解 这是为啥。

...全文
178 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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().

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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