2

我们可以使用def文件导出序数。但是系统dll不使用def文件。仍然shell32.dll有569个序数导出,user32.dll有181个序数导出。

有没有办法在没有def文件的情况下导出序数?

4

1 回答 1

5

每个导出的函数都有一个序数。链接器会自动对它们进行编号,它从 1 开始。但是如果您想控制确切的值(就像 Microsoft 对这些 DLL 所做的那样),那么您必须使用 .def 文件。

仅当客户端代码以前使用序数时才需要,并且您需要与未重建的旧代码的二进制兼容性,并且您添加或删除了导出的函数。为了达到 99.99% 的准确度,客户端代码从不使用序数来链接导出的函数。他们总是使用这个名字。如果您在 .def 文件中导出具有 NONAME 属性的函数,那么您将只依赖于序数值,从而强制客户端代码改用序数。实际上,只有在您想要隐藏导出时才会这样做。

Microsoft 永远无法对此做出任何假设,并且在过去 23 年中被迫保持这些 DLL 二进制兼容。一个不属于我们的负担。

于 2016-07-18T06:43:00.277 回答