是否可以更改为dll,同时保持与预编译的可执行文件的兼容性?

时间:2011-09-30 19:09:38

标签: c++ windows dll backwards-compatibility

我们有很多可执行文件可以引用我们的一个dll。我们在其中一个dll中发现了一个错误,并且不希望重新编译和重新分发所有可执行文件来修复它。 我的理解是dll将保持与可执行文件的兼容性,只要您不更改头文件中的任何内容即可。所以没有新的类成员,没有新的函数等......但是对函数中逻辑的改变应该没问题。它是否正确?如果它是特定于编译器的,请告诉我,因为这可能是一个问题。

3 个答案:

答案 0 :(得分:7)

您的理解是正确的。只要您更改逻辑但不更改接口,则不会遇到兼容性问题。

你必须要小心的是,DLL的接口不仅仅是函数签名。例如,如果原始DLL接受int参数,但新DLL强制执行约束,该参数的值必须为正,那么您将破坏旧程序。

答案 1 :(得分:3)

这会奏效。只要DLL的接口保持不变,较旧的可执行文件就可以加载它并使用它就好了。话虽这么说,你正在开始一条非常危险的道路。随着时间的推移,您修补越来越多的DLL,您可能会开始看到几乎无法诊断的客户安装上的奇怪行为。这是由各种组件的不同版本之间的意外交互引起的。从历史上看,这个问题被称为DLL地狱。

在我看来,重建,重新测试和重新分发整个应用程序是一个更好的主意。我甚至会进一步建议你使用应用程序清单来确保你的可执行文件只能 使用你的DLL的特定版本。现在看起来似乎很多工作,但它确实可以为你节省很多麻烦。

答案 2 :(得分:0)

取决于

理论上是的,如果您使用LoadLibrary加载dll并且没有更改界面,那么您应该没问题。

如果OTOH使用.lib存根链接到.dll文件,则无法保证它可以正常工作。

这是COM被发明的原因之一。