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

Wou*_*ick 6 delphi dll

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

library hahaha;

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

exports
  ha, ha, ha;    
end.
Run Code Online (Sandbox Code Playgroud)

Delphi用三个程序巧妙地创建了一个.dll: 在此输入图像描述

我很惊讶这个模糊的电话GetProcAddress(LoadLibrary('hahaha.dll'), 'ha')不会失败.

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

Dav*_*nan 8

一个有用的地方是当你想用不同的名字多次导出函数时.例如,如果我们试图user32在Delphi中重新实现,我们可能会有这样的导出:

exports
  SetWindowTextA,
  SetWindowTextA name 'SetWindowText';
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 他们没有考虑那个案例,或者
  2. 他们认为并确定阻止多个同名进口所涉及的努力无法提供足够的利益来证明开发成本.

至于GetProcAddress使用多次导出的函数名调用时会发生什么,系统将返回名称匹配的第一个导出函数.