0

在我们的程序中,我们使用 Web 服务将数据从第三方提取到我们的程序中。

自从我们从 Delphi 2009 更新到 Delphi XE 后,Windows server 2003 用户在对 Web 服务进行 SOAP 调用时收到以下错误消息。

在此处输入图像描述

Server 2003 上的 msvcrt.dll 没有过程 _ftol2_sse,现在由于某种原因正在调用它。

我知道当我们在 Delphi 2009 上获得源代码时没有调用此过程,因为在运行这些构建时我在 Windows server 2003 上没有收到此错误。

这可行吗?IDE 中的更改会影响正在调用的 dll 过程吗?是否有人对我如何追踪或修复此错误有任何见解或想法?

谢谢

4

1 回答 1

2

这是您就该主题提出的第三个类似问题。我将尝试为您提供一些背景信息并帮助您弄清楚发生了什么。

首先,重要的是要知道 msvcrt.dll 是一个系统组件。它不是 MSVC 运行时。它作为 Windows 的一部分提供。回到糟糕的过去,在 90 年代中期,许多开发人员认为 MSVC6 运行时始终可用。他们忽略了将运行时安装为程序安装的一部分。当安装程序碰巧找到没有 MSVC6 的机器时,这偶尔会引起麻烦。

MSVC 团队转移到不同名称的运行时 DLL、msvcrt70.dll、msvcrt80.dll 等。他们教育开发人员安装 MSVC 运行时应该是所有 MSVC 应用程序安装程序的一部分。

但 Windows 团队希望帮助那些安装程序假定 MSVC6 运行时可用的遗留应用程序。因此,他们将 MSVC6 运行时置于他们的控制之下,并开始随 Windows 一起发布。我认为这开始于 Windows 2000 或 XP 左右。

我要说明的一点是 msvcrt.dll 是一个您无法控制的系统 DLL。在您之前的问题中,您已经描述了修改该 DLL 的尝试。不要那样做。

现在,据我所知,2003 服务器附带的 msvcrt.dll 版本没有导出名为_ftol2_sse. 这不足为奇,因为 SSE 浮点在 2003 年服务器时代并未广泛使用。显然,您系统中的某些内容导致尝试导入_ftol2_sse.

您应该能够通过使用Dependency Walker找出引发这种情况的原因。使用 Profile 菜单上的功能启动您的应用程序并仔细研究日志。您应该能够看到导致尝试链接到的事件链_ftol2_sse

如果有任何 Windows 代码链接到 msvcrt.dll,我会感到惊讶。该库纯粹是作为链接到 MSVC6 的旧版应用程序的道具提供的。但你永远不知道。

还可以尝试在 Dependency Walker 中加载您的可执行文件。查看导入的 DLL 列表。检查 msvcrt.dll 是否在列表中。如果是这样,请查看您的可执行文件导入了哪些函数,以及是否_ftol2_sse在该列表中。如果是这样,那么您将能够在 Delphi 源代码的某处找到它。

从网络上各种类似的冠冕堂皇的报道中,我怀疑您面临的问题是良性的。许多报告相同问题的人可以确定对话框并让他们的程序继续运行而不会出现问题。这表明您可以简单地抑制错误报告,从而解决您的问题。使用该SetErrorMode功能来做到这一点。你想包括SEM_FAILCRITICALERRORS标志。

请注意,它SetErrorMode有一个相当反常的界面。我见过的几乎所有代码都错误地使用了它。包括Delphi RTL中的代码,以及很多常用的Delphi第三方库。Raymond Chen像往常一样解释如何正确使用它

切换编译器会引发行为变化吗?他们当然可以。您正在使用的库代码的实现方式不同。或者在关键时刻错误模式可能有所不同。

于 2012-10-16T20:14:10.517 回答