如何让编译出的新版dll,可以直接替换旧版本的dll

sophyyoung 2013-04-12 01:37:05
其实就是本来有个 a.lib和a.dll,是别人开发的,用户程序为b.exe,使用了a.dll。
之后我重新写了个新的lib和dll,接口函数都是一样的,考虑到兼容性,依然取名 a.lib和a.dll,可是却不能直接替换b.exe里面的a.dll,b还是需要包含新的a.lib,然后rebuild一下,才行,不知道有没有办法可以让在不重新编译用户程序的情况下,编写新的 dll呢?
...全文
1184 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-06-06
  • 打赏
  • 举报
回复
只要新的DLL和旧的DLL没有本质差别(实现相同功能,同为32BITS或者同为64BITS,没有错误),完全可以直接替换。 不能替换, 是导出函数名有改变或者导出方式不同,或者函数参数不同,函数调用约定不同等造成的。
weiql6 2013-04-19
  • 打赏
  • 举报
回复
不能吧,按楼主所说的情况,应该不需要重新rebuild的。我试了下,是不需要的。
chentao 2013-04-18
  • 打赏
  • 举报
回复 1
DLL中得函数在EXE中是隐式链接的,需要用到和DLL对应的导入库lib文件,并且编译成EXE时,这些导入库的信息会被写入到EXE的导入段,所以才不能直接替换。
sophyyoung 2013-04-12
  • 打赏
  • 举报
回复
唉,白开心一场,确实不能用,我刚才用NI 公司的labwindows 写的用户程序,debug能用,但release 在退出时有个如下错误: FATAL RUN-TIME ERROR: Unknown source position, thread id 0x00001ED4: The program has caused a 'General Protection' fault at 001B:686591AD. 使用windbg时错误是:Access violation - code c0000005 (first chance) 于是我转用 vs2008 里的 vc++ 写的用户程序,这下界面都出不来了。说的错误是: First-chance exception at 0x00000003 in AutoTest.exe: 0xC0000005: Access violation. Unhandled exception at 0x00000003 in AutoTest.exe: 0xC0000005: Access violation. 看起来错误都是一样的。 使用新的lib,重新编译一下就可以了。没有这样的问题了。。
sophyyoung 2013-04-12
  • 打赏
  • 举报
回复
看过了,也试过了,之前试的时候确实不行的,怎么今天试了就可以了呢! 主要是我用 depends 看的,他们的函数名都是一样的没错,但每个函数后面的 entry point 不同,我就以为不可以用了。
一个傻冒 2013-04-12
  • 打赏
  • 举报
回复
如果是delphi写的dll,那要改些东西才行。 楼主用工具先确认一下是用语言写的。用些查壳的工具,或者反汇编过来看看,也大概能知道。
无言猪 2013-04-12
  • 打赏
  • 举报
回复
用depends看一下两个dll的函数名一致不,有些不注意的地方也会引起导出函数名的不一直,比如extern "C", 或者用def文件重写了函数名的.
sophyyoung 2013-04-12
  • 打赏
  • 举报
回复
原来的dll都不知道拿什么编译的,这样都可以吗?
jimette 2013-04-12
  • 打赏
  • 举报
回复
引用 1 楼 ydfivy 的回复:
只要DLL的接口函数一定,只要符合这个调用函数,DLL就可以被调用。你的为啥要重新编译一下呢?
是这个道理 不能是把接口参数改了把?
一个傻冒 2013-04-12
  • 打赏
  • 举报
回复
只要DLL的接口函数一定,只要符合这个调用函数,DLL就可以被调用。你的为啥要重新编译一下呢?

15,473

社区成员

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

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