【问题标题】:Delphi XE6 DLL: Unwanted export: TMethodImplementationInterceptDelphi XE6 DLL:不需要的导出:TMethodImplementationIntercept
【发布时间】:2014-09-03 07:37:39
【问题描述】:

当您在 Delphi XE6 中编译 DLL 时,它会自动从 System.Rtti.pas 导出函数 TMethodImplementationIntercept。我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令。

System.Rtti 单元几乎是不可能避免的,因为它被 delphi 中的几乎所有东西间接使用。

在 XE6 中构建 DLL 时有没有办法避免导出这个函数?

【问题讨论】:

  • 只是一个问题:为什么避免导出这个函数很重要?
  • 第一:在大多数情况下它是没用的。第二:这很奇怪。
  • @HEARTWARE 喜欢整洁
  • @Kekas 这是 XE6 中的新功能吗?
  • @DavidHeffernan 我从 XE2 跳到 XE6,所以我还不知道。

标签: delphi dll rtti delphi-xe6


【解决方案1】:

System.Rtti 单元中的代码如下所示:

{ This function has been added to be used from .s .c files in order to avoid use mangled names}
procedure TMethodImplementationIntercept(const obj:TMethodImplementation; AFrame: Pointer); cdecl;
begin
  obj.Intercept(AFrame);
end;
exports TMethodImplementationIntercept;

此函数和exports 指令是在 XE5 中添加的。

在 XE6 中构建 DLL 时有没有办法避免导出这个函数?

如果您的库包含 System.Rtti 单元,则 DLL 将导出该函数。如果要生成不导出函数的 DLL,我可以看到以下选项:

  1. 使用旧版本的 Delphi。
  2. 不要在您的库中包含 System.Rtti
  3. 使用不导出函数的System.Rtti 的修改版本。
  4. 在生成 DLL 后对其进行修改,以从 PE 导出表中删除该函数。

在我看来,前两个选项不是很吸引人。第三种选择似乎很有吸引力,但我认为它可能很难成功。看来这个长期存在的把戏不再奏效了。我还不能重新编译 RTL 单元并避免可怕的 X 编译时使用不同版本的 Y 错误。

这样就剩下最后的选择了。再次,没有很大的吸引力。你很可能决定接受它并接受这个杂散的出口。也许 QC 报告可能会给 Embarcadero 带来一些压力,让他们重新考虑这一决定。

对于它的价值,在我看来,任何编译器库代码都不应该无条件地导出函数。做出该决定的应该是库的使用者,而不是库的实现者。

【讨论】:

  • 我完全同意no compiler library code should ever unconditionally export a function。选项 2 对我来说是不可能的,因为正如我之前所说,几乎所有东西都间接使用了 RTTI。我有一个自动构建系统,它已经使用第四个选项和我开发的工具。我正在考虑在有时间的时候尝试第三个选项,因为第四个选项看起来更像是一个 hack。
  • @DavidHeffernan 因为XE4(我认为),所以无法避免System.Rtti,因为它被System.Classes使用。
  • @Stefan 虽然可以避免Classes,但当你这样做时,剩下的不多了。越看XE6,越喜欢XE3。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 2015-10-11
  • 2023-03-09
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2014-10-22
相关资源
最近更新 更多