dll中的向后兼容性

时间:2010-06-01 13:31:04

标签: delphi dll overloading delphi-2007 backwards-compatibility

我确实有三个dll。

  • a.dll - 多年前发布的
  • b.dll - 发布的时间不是很多年
  • c.dll - 很快就会发布

每个都包含相同的功能 - 不幸的是具有不同的参数。 所以我有以下方法

aMethod(param1)
aMethod(param1, param2)
aMethod(param1, param2, param3)

我的任务是创建一个向后兼容的新dll(或新dll)。 但据我从谷歌学到的,没有可能在dll中重载方法。

有没有人知道如何才能优雅地解决这个问题?

3 个答案:

答案 0 :(得分:1)

您可以重载DLL中的函数签名。但是,从DLL导出的函数 names 必须是唯一的 - 这是Windows要求,而不是Delphi要求。因此,将Delphi中的函数声明为重载,但要确保使用您定义的特定唯一名称导出它们。从新的多合一DLL导入的客户端将需要使用您定义的唯一名称导入。

Delphi中的默认行为是导出的函数由函数名称导出,简单明了。如果要进行重载,则需要更多地参与并自己定义导出名称。

但请注意,这不会产生可以放入期望您的a.dll的旧应用程序的DLL。此解决方案向后兼容源,但不向后兼容二进制文件。

您很可能无法创建与所有三个过去的DLL版本二进制兼容的新DLL,因为旧的exe二进制文件指的是相同的函数名,但期望不同的行为(不同的参数列表)。

另请注意,如果您的三个dll版本实际上有不同的文件名(a,b,c),那么这一点有点没什么 - 静态函数绑定绑定到dll名称+函数名称。如果您希望新的DLL与旧的exes一起使用,您是否计划将新的dll复制三次到文件名a,b和c?这似乎很奇怪,适得其反。和睡狗一样,让老DLL说谎。除非你绝对必须修复一些关键的错误,否则不要管它们。

答案 1 :(得分:0)

在我知道你可以使用方法重载之前,你只需要在同一个dll中实现以前的版本和新版本。在Delphi中,您需要使用overload指令。看到这个链接:

http://delphi.about.com/od/objectpascalide/a/overloading.htm

答案 2 :(得分:0)

使这个方法更通用 - 将其改为类似的东西 - 我不熟悉Delphi,所以这个例子在C#中:

aMethod( int version, object args)

或在C:

aMethod (int version, void** args)

然后根据版本你可以使用cast。请注意,args也可以是一个集合对象。

HTH。