【问题标题】:Check for parameter existence in a dll function (Delphi 5)检查 dll 函数中是否存在参数(Delphi 5)
【发布时间】:2016-03-22 04:38:34
【问题描述】:

有什么方法可以检查 dll 内的函数中是否存在参数(使用 Delphi 5)? 假设我想在 MyDll.dll 中调用 MyFunction() 但我不确定最近添加的参数是否存在。出于向后兼容性的原因,这是必需的。

我在这里找到了有用的主题: How to check a DLL if a function exists?

我试过了,它对我有用。但是是否可以扩展它来获取 MyFunction() 的所有参数?

提前致谢。

问候,

亚历克斯

【问题讨论】:

  • 简而言之 - 这是不可能的。如果您需要向后兼容 - 将新函数重命名为 MyFunction2
  • 规则是接口一旦发布就不得更改。
  • 正如大卫所说,永远不要改变界面。您可以添加新功能来扩展“旧”功能的功能,但这些功能永远不会改变。

标签: delphi dll


【解决方案1】:

否 - 无法从标准 Windows DLL 确定导出函数中使用的参数。唯一可用的信息是函数的名称和/或序号(它们都指向导出函数第一条指令的 .DLL 中的入口点)。

如果 .DLL 是用 Microsoft C++ 制作的,您可以使用 Name Mangling,但这实际上会在您每次更改函数的签名(参数列表和/或返回值)时生成一个新的导出函数,因此将消除向后兼容性(函数的参数以编码形式附加到导出的名称,因此 - f.ex. - 导出的函数

void MyFunc(int p1)

将被导出为(这里只是为了说明):

MyFunc@jefal8936

如果你把它改成

void MyFunc(int p1, char p2)

然后导出的名称可能会突然变成

MyFunc@kaybx42

因此,链接到 MyFunc@jefal8936 的旧编译程序将无法再找到其入口点(因此,如果与静态链接链接,甚至无法加载)。 p>

完成您尝试做的事情的唯一方法是在您的 .DLL 中创建一个新的导出函数(一种约定是使用 FuncNameEx 作为带有附加参数的“扩展”版本)和那么您可以从旧的 FuncName 函数中调用 FuncNameEx(假设您可以将旧函数的参数“转换”为新函数)。

【讨论】:

  • 如果导出的函数被破坏了...一个优秀的 C++ 程序员会在从 DLL 导出时摆脱名称破坏。
  • 函数名称不是唯一可用的信息。还有很多其他元数据,例如 DLL 的版本信息、其他函数的名称,甚至文件的大小。它们都可以指示正在使用哪个版本的 DLL,因此可以告诉该函数需要哪些参数。 (如果可以的话,提供一个独特的新功能显然是更好的选择。)
  • 是的,我同意您关于遵循编程标准的观点。但就我而言,我必须应对我所拥有的,因为我正在从事一个 15 多年前开始的项目,其中有许多程序员参与其中,并不是每个人都遵循标准。所以我选择了 Rob Kennedy 的解决方案。我将检查 dll 版本,并根据它调用 MyFunction() 是否带有新参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2012-11-22
相关资源
最近更新 更多