在我们的计划中,我们使用网络服务将第三方的数据撤回到我们的计划中。
自从我们从Delphi 2009更新到Delphi XE以来,Windows server 2003用户在对Web服务进行SOAP调用时收到以下错误消息。
Server 2003上的msvcrt.dll没有_ftol2_sse程序,现在由于某种原因被调用了。
我知道当我们在Delphi 2009上获得源代码时,没有调用此过程,因为在运行这些构建时,我在Windows Server 2003上没有收到此错误。
这可行吗? IDE中的更改是否会影响调用哪些dll过程?有没有人对我如何追踪或修复此错误有任何见解或想法?
由于
答案 0 :(得分: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找出引发这种情况的原因。使用“配置文件”菜单上的功能启动应用程序并仔细研究日志。您应该能够看到导致尝试链接到_ftol2_sse
的事件链。
如果任何Windows代码链接到msvcrt.dll,我会感到惊讶。该库纯粹作为支持MSVC6链接的遗留应用程序提供。但你永远不知道。
还尝试在Dependency Walker中加载可执行文件。查看导入的DLL列表。检查msvcrt.dll是否在列表中。如果是,请查看可执行文件导入的函数,以及_ftol2_sse
是否在该列表中。如果是这样,那么你将能够在Delphi源代码中找到它。
从网上各种类似的声音报道中我怀疑你面临的问题是良性的。报告相同问题的许多人都可以确定对话框并让他们的程序继续没有问题。这表明您可以简单地抑制错误报告,从而解决您的问题。使用SetErrorMode
功能执行此操作。您想要包含SEM_FAILCRITICALERRORS
标记。
请注意SetErrorMode
有一个相当不正常的界面。我见过的几乎所有代码都使用它不正确。包括Delphi RTL中的代码,以及许多常用的Delphi第三方库。 Raymond Chen像往常一样explains how to use it correctly。
切换编译器会引发行为改变吗?当然可以。您正在使用的库代码的实现方式不同。或者错误模式在关键时刻可能会有所不同。