如果实际导出"ordinal N not found in DLL"错误,可能导致什么原因?

What could be causes of "ordinal N not found in DLL" error if it's actually exported?

本文关键字:什么 错误 in 果实 ordinal 如果 found not DLL      更新时间:2023-10-16

我太笨了,导致GFWL被游戏拖累(而GFWL已经瘫痪)。我发现了一个名为XLiveLess的项目,该项目旨在将XLive.dll重新实现为一个存根,它只做运行游戏所需的最小工作。

当我放置了预先构建的DLL时,我得到的只是"序号29无法在动态链接库中定位"错误。因此,我运行了一个调试器来查找对该导出的调用,推导出签名,向.cpp和.def文件添加适当的代码,并构建了库。现在,在更新DLL后,我仍然会得到同样的错误,但dumpbin /exports xlive.dll清楚地向我显示#29已导出——输出中有一行29 000024A0 [NONAME]

我也确信我自己构建的库正是xlive.dll游戏正在访问的——如果我删除二进制文件,它就会开始抱怨dll丢失。如果这很重要的话,我目前正在Windows 8.0 x86_64下运行。

现在我迷失了方向,感到困惑,而且我对Windows编程没有经验(大约15年前做过,但从那时起几乎忘记了一切)。是什么可能导致加载程序仍然找不到导出的函数,即使它就在那里?我是不是错过了什么?

(至于我行为的合法性,如果这些都很重要,在我居住的管辖范围内,我被明确允许出于兼容性和互操作性的目的对软件进行逆向工程。)

解决了它。

出于某种原因,我完全不知道,错误消息框中的序号对我来说是减去一。因此,当错误消息说"序号#29"时,它的意思是@30。事实上,它是缺失的,因为我本来打算一个接一个地添加导出,只添加了@29(它也缺失了,但在此之前检查了@30),并想知道为什么错误消息没有改变。