2010-06-01 130 views
3

我确实有三个dll。向后兼容性dll

  • A.DLL - 发布多年前
  • B.DLL - 发行不这么多年
  • c.dll - 发布不久

各包含相同的功能 - 可惜的是用不同的参数。 所以我有以下方法

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

我的任务就是让一个新的DLL(或新的DLL)至极是向后兼容。 但据我从Google了解到,不可能在DLL中重载方法。

有没有人有一个提示,我可以如何优雅地解决这个问题?

回答

1

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

Delphi中的默认行为是导出的函数通过函数的名称导出,非常简单。如果你想做重载,你需要更多地参与并自己定义导出名称。

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

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

还要注意,如果你的三个dll版本实际上有不同的文件名(a,b,c),那么这个点有点没有意义 - 静态函数绑定绑定到dll名称和函数名。如果你想让你的新DLL和旧版本一起工作,你打算将新的dll拷贝三次到文件名a,b和c吗?这看起来很奇怪,适得其反。与睡觉的狗一样,让旧的DLL说谎。除非你绝对必须修复一些重要的bug,否则不要担心。

+0

最后,使用cmd比较库的所有版本的符号列表:“dumpbin/EXPORTS .dll”。列表“c”应包含列表“b”,列表“b”应包含列表“a”。在运行dumpbin命令(通常放置在C:\ Microsoft Visual Studio 9.0 \ Common7 \ Tools \\)之前,应该运行vsvars32.bat。 – aponomarenko 2011-01-14 21:31:21

0

直到我知道你可以使用方法重载,你只需要在同一个DLL中实现以前和新版本。在Delphi中,你需要使用过载指令。请参阅此链接:

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

+0

当函数被导出到dll(stdcall;)时,这也起作用吗?在dll中允许超载吗?因此,我可以有两个函数(在Delphi中)可以从phu调用,假设C a函数(a,b:Integer,c:PChar):WORD; stdcall; (a,b:整数):WORD; stdcall; – Michael 2010-06-01 13:48:46

0

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

aMethod(int version, object args) 

或C:

aMethod (int version, void** args) 

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

HTH。

+0

在德尔福everthing工作正常 - 尽可能好: - /。 我的问题是 - 据我所知 - 这是不允许甚至可能在DLL中有重载的方法。 – Michael 2010-06-01 13:51:39