Delphi Tokyo 10.2.2 - Win XP 在运行时不加载包

Posted

技术标签:

【中文标题】Delphi Tokyo 10.2.2 - Win XP 在运行时不加载包【英文标题】:Delphi Tokyo 10.2.2 - Packages do not load at runtime in Win XP 【发布时间】:2018-06-14 06:11:36 【问题描述】:

我使用的是新的 Delphi Tokyo 10.2.2,在我的例子中,我使用的是在运行时加载的包。

即使做一个简单的例子并请求 EXE 仅加载 RTL 单元也会发生运行时错误,仅在 Windows XP 操作系统上:

在动态链接库WS2_32.dll中找不到过程入口点inet_ntop

使用 Delphi Tokyo 10.2.1 不会出现问题。

有什么想法吗?

【问题讨论】:

Delphi 不支持针对XP,已经很久不支持了。如果您需要支持 XP,请使用支持 XP 的旧版 Delphi。更明智的做法是停止支持 XP。 话虽如此,我知道 Emba 不会故意停止在 xp 上运行的可执行文件。也许这是无意的。向 QP 提交问题。 @Ken 这并非完全正确。这些版本并没有故意阻止在 xp 上运行的可执行文件。 Emba 说他们不会在 xp 上进行测试,但他们不会主动阻止在 xp 上运行的可执行文件。而且我很确定柏林和之前的东京版本生成了可以在 xp 上运行的可执行文件。 @DavidHeffernan:这完全正确 - 请参阅 Supported Target Platforms,它说 Windows 7 (SP1) 是受支持的最旧的 Windows 版本。我没有说主动阻止。我说不支持 @ken 这部分很好,我同意。事实上,我什至写了一条评论来表达完全相同的事情。但是你说的更多。我评论的正是这一行:它们依赖于 XP 中不存在的功能。这不是真的。 【参考方案1】:

我有一个新的项目代理函数,用于原始 Windows XP 的 WS2_32.dll 的所有导出函数,包括 Windows XP 的 WS2_32.dll 中缺少的 inet_pton

它欺骗 Windows XP 应用程序进程认为inet_pton 可用并且不提示任何错误。

存储库:https://github.com/ccy/WS2_32_XP

【讨论】:

【参考方案2】:

inet_ntop() 在 Windows Vista 中被添加到 Winsock,它在 XP 中不存在。

显然,Embarcadero 在 10.2.2 中向 RTL 添加了新代码,该代码静态调用 inet_ntop() 而不是动态调用。 10.2.1 中 RTL 中不存在的代码。这就是在 XP 上加载 10.2.2 的 RTL 包时发生错误的原因。

对此你无能为力。如果您必须在 XP 上运行您的应用程序(Embarcadero 在 XE3 中放弃了对它的支持),那么您不能使用 10.2.2 RTL。

【讨论】:

当同一个应用程序在编译时添加了包,即运行时没有加载RTL,不会出现问题。在 Win XP 上完美运行!为什么? @ZoeTecnologia 当运行时包被静态编译到应用程序中时,编译器/链接器可以优化掉实际未使用的代码。动态加载的运行时包并非如此 感谢您的澄清。我只剩下一个问题:我可以通过在设计时包含 RTL 来解决 EXE 问题,但是在加载系统模块(在 BPL 中)时会发生错误,因为这些模块需要 RTL(正如您所解释的)。有什么方法可以在我的 BPL 中加载/包含 RTL? @ZoeTecnologia:正如我之前所说,如果您在 RTL 中静态链接(在使用 BPL 时不应该这样做),那么未使用的 RTL 代码会被优化掉。如果您动态链接到 RTL 的 BPL(在使用 BPL 时应该这样做),您将无能为力,受影响的代码存在并阻止 RTL 在 XP 上加载。【参考方案3】:

全部,

我能够通过创建一个嵌入了所有必要单元的包来解决这个问题。

然后是引用这个单一新包的可执行文件和其他 BPL(模块)。

它在 win XP 中再次起作用!

感谢大家的支持

【讨论】:

我忘了告诉作者 (Keith Johnson) 在他关于使用 BPL 包的系统的文章中。 (我没有找到文章链接了)

以上是关于Delphi Tokyo 10.2.2 - Win XP 在运行时不加载包的主要内容,如果未能解决你的问题,请参考以下文章

Delphi10.2 Tokyo试用

GUI example for Windows X System with Delphi Tokyo

Delphi Tokyo 64 位将非正规数刷新为零?

Delphi Tokyo 10.2 Windows 7上的TDSRestConnection DataSnap连接

Delphi Tokyo - 功能:字符串为十六进制,十六进制为字符串

Delphi发布了社区版