为什么我可以多次导出同一个函数?
Why can I export the same function multiple times?
当我多次从库中导出程序 ha
时:
library hahaha;
procedure ha;
begin
Writeln('ha')
end;
exports
ha, ha, ha;
end.
Delphi 巧妙地创建了一个包含三个过程的 .dll:
令我惊讶的是,模棱两可的调用 GetProcAddress(LoadLibrary('hahaha.dll'), 'ha')
没有失败。
这让我想知道:这在某些情况下有用吗?
当您希望使用不同的名称多次导出函数时,这很有用。例如,如果我们试图在 Delphi 中重新实现 user32
,我们可能会有这样的导出:
exports
SetWindowTextA,
SetWindowTextA name 'SetWindowText';
在您的情况下,虽然您使用相同的名称和不同的序数值多次导出相同的函数。你为什么想这么做?我看不出有什么好的理由要这样做。但是,编译器为什么要阻止你这样做呢?这样做需要编译器开发人员的努力,会得到什么?
因此,我的猜测是编译器开发人员没有在多个同名导出上实现块,因为:
- 他们没有考虑那种情况,或者
- 他们考虑了这一点,并确定阻止多个同名导入所涉及的工作不会提供足够的收益来证明开发成本的合理性。
至于调用GetProcAddress
时调用GetProcAddress
的函数名已经导出多次,系统会return第一个导出的名字匹配的函数
当我多次从库中导出程序 ha
时:
library hahaha;
procedure ha;
begin
Writeln('ha')
end;
exports
ha, ha, ha;
end.
Delphi 巧妙地创建了一个包含三个过程的 .dll:
令我惊讶的是,模棱两可的调用 GetProcAddress(LoadLibrary('hahaha.dll'), 'ha')
没有失败。
这让我想知道:这在某些情况下有用吗?
当您希望使用不同的名称多次导出函数时,这很有用。例如,如果我们试图在 Delphi 中重新实现 user32
,我们可能会有这样的导出:
exports
SetWindowTextA,
SetWindowTextA name 'SetWindowText';
在您的情况下,虽然您使用相同的名称和不同的序数值多次导出相同的函数。你为什么想这么做?我看不出有什么好的理由要这样做。但是,编译器为什么要阻止你这样做呢?这样做需要编译器开发人员的努力,会得到什么?
因此,我的猜测是编译器开发人员没有在多个同名导出上实现块,因为:
- 他们没有考虑那种情况,或者
- 他们考虑了这一点,并确定阻止多个同名导入所涉及的工作不会提供足够的收益来证明开发成本的合理性。
至于调用GetProcAddress
时调用GetProcAddress
的函数名已经导出多次,系统会return第一个导出的名字匹配的函数