【发布时间】:2015-03-23 16:23:19
【问题描述】:
当我从库中多次导出过程ha 时:
library hahaha;
procedure ha;
begin
Writeln('ha')
end;
exports
ha, ha, ha;
end.
Delphi 巧妙地创建了一个包含三个过程的 .dll:
我很惊讶GetProcAddress(LoadLibrary('hahaha.dll'), 'ha') 的模棱两可的调用没有失败。
这让我想知道:这有什么用处吗?
【问题讨论】:
-
为什么
GetProcAddress()会失败?它只是返回它找到的第一个具有匹配名称的函数,它不检查该名称是否重复多次。德尔福也不在乎。如您所见,每个导出的函数都有不同的序数值。 Delphi 只是用您告诉它导出的任何名称填充EXPORTS表。 -
@RemyLebeau 我知道这非常愚蠢和挑剔,但实际上是否有消息来源指出
GetProcAddress返回 first? -
@GünthertheBeautiful,它也可能返回 last(取决于导出表查找实现),但无论如何返回的地址都是正确的。
-
@Wouter,你为什么认为你的电话是模棱两可的?您要求 pointer by name 并且该函数根据其合同返回正确的结果。合约没有强制验证导出表中名称唯一性的功能。
-
@FreeConsulting:如果房间里有 3 个叫“John”的人,我让 John 给我 10 欧元,那么所有 Johns 都会说我含糊不清。跨度>