Delphi XE6 DLL:不需要的导出:TMethodImplementationIntercept

时间:2014-07-13 01:12:46

标签: delphi dll rtti delphi-xe6

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

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

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

1 个答案:

答案 0 :(得分:6)

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之后修改DLL以从PE导出表中删除该函数。
  5. 在我看来,前两个选项并不是很吸引人。第三种选择看起来很有吸引力,但我认为这可能很难成功。似乎这个长期存在的伎俩不再起作用。我还没有能够重新编译RTL单元,并避免使用不同版本的Y 错误编译可怕的 X.

    这样就留下了最后的选择。再一次,没有大量的吸引力。你可能决定只是把它搞砸并接受这种迷失的出口。也许质量控制报告可能会给Embarcadero带来一点压力,要求重新考虑这个决定。

    对于它的价值,在我看来,编译器库代码不应该无条件地导出函数。它应该是图书馆的消费者,而不是作出决定的图书馆的实施者。