【问题标题】:Backward compatibility in dllsdll 中的向后兼容性
【发布时间】:2010-06-01 13:31:04
【问题描述】:

我确实有三个 dll。

  • a.dll - 多年前发布
  • b.dll - 发布时间不长
  • c.dll - 即将发布

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

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

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

有没有人告诉我如何优雅地解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    还请注意,如果您的三个 dll 版本实际上具有不同的文件名(a、b、c),那么这一点有些实际意义 - 静态函数绑定绑定到 dll 名称 + 函数名称。如果您希望新的 DLL 与旧的 exe 一起工作,您是否打算将新的 dll 复制 3 次到文件名 a、b 和 c?这似乎很奇怪,而且适得其反。就像睡狗一样,让旧的 DLL 撒谎。除非您绝对必须修复一些严重的错误,否则不要管它们。

    【讨论】:

    • 最后,使用 cmd:"dumpbin /EXPORTS .dll" 比较库的所有版本的符号列表。列表“c”应包含列表“b”,列表“b”应包含列表“a”。您应该在运行 dumpbin 命令之前运行 vsvars32.bat(通常位于 C:\Microsoft Visual Studio 9.0\Common7\Tools\)。
    【解决方案2】:

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

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

    【讨论】:

    • 当函数导出到 dll (stdcall;) 时这是否也有效。 dll中是否允许重载?这样我就可以有两个可以从 phu 调用的函数(在 Delphi 中),比如说 C aFunction(a,b: Integer, c: PChar):WORD;stdcall; aFunction(a,b: Integer):WORD;stdcall;
    【解决方案3】:

    让这个方法更通用——把它改成这样——我不熟悉Delphi,所以这个例子是用C#编写的:

    aMethod( int version, object args)
    

    或在 C 中:

    aMethod (int version, void** args)
    

    然后根据版本可以使用强制转换。注意 args 也可以是一个集合对象。

    HTH。

    【讨论】:

    • 在 Delphi 中一切正常 - 尽可能好 :-/。我的问题是 - 据我所知 - 不允许甚至不可能在 dll 中使用重载方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多