为什么我可以多次导出相同的功能?

时间:2015-03-23 16:23:19

标签: delphi dll

当我多次从库中导出过程ha时:

library hahaha;

procedure ha; 
begin 
  Writeln('ha') 
end;

exports
  ha, ha, ha;    
end.

Delphi整齐地创建了一个包含三个过程的.dll: enter image description here

我很惊讶,模糊的电话GetProcAddress(LoadLibrary('hahaha.dll'), 'ha')并没有失败。

这让我想知道:这是否有用?

1 个答案:

答案 0 :(得分:8)

有用的地方是您希望使用不同的名称多次导出该函数。例如,如果我们试图在Delphi中重新实现user32,我们可能会有这样的导出:

exports
  SetWindowTextA,
  SetWindowTextA name 'SetWindowText';

在您的情况下,虽然您使用相同的名称和不同的序数值多次导出相同的函数。你为什么想这么做?我没有理由想要这样做。但是,编译器为什么要阻止你这样做呢?编译器开发人员需要付出努力才能这样做,会得到什么?

我的猜测是,编译器开发人员没有在同一个名称的多个导出上实现一个块,因为:

  1. 他们不考虑这种情况,或
  2. 他们认为并确定阻止多个同名导入所涉及的工作不足以证明开发成本合理。
  3. 对于使用已多次导出的函数名称调用GetProcAddress时会发生什么情况,系统将返回名称匹配的第一个导出函数。