这是您就该主题提出的第三个类似问题。我将尝试为您提供一些背景信息并帮助您弄清楚发生了什么。
首先,重要的是要知道 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像往常一样解释如何正确使用它。
切换编译器会引发行为变化吗?他们当然可以。您正在使用的库代码的实现方式不同。或者在关键时刻错误模式可能有所不同。