【问题标题】:procedure _ftol2_sse being called after update to Delphi XE?更新到 Delphi XE 后调用过程 _ftol2_sse?
【发布时间】:2012-10-16 19:43:39
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 今天早些时候,您认为它是由 XMLDocument 引起的。您确定现在是 SOAP 调用吗? stackoverflow.com/questions/12900487/…
  • 嗯,我很难找到问题的根源。这个错误至少在一些 XMLDocument 调用之后弹出,但是当我注释掉这些行时,错误仍然会慢慢出现,直到我注释掉几乎每一行。一旦我认为我找到了它发生的行,我就注释掉了那行并带回了其余的行,它仍然出现了。所以它似乎只是发生在程序中的多个地方。这个 Web 服务调用是它发生的程序的另一个区域。所以我只是想我会提到它。我想知道对 xe 的更改是否会导致它。
  • 你知道如何使用调试工具吗?特别是断点和单步执行代码?如果您能真正追踪导致错误的那一行,这将对您自己(和我们)有所帮助。
  • 是的,我遇到的问题是我无法在我的开发环境中重现该错误,它严格来说是 Windows 2003 服务器问题。

标签: delphi soap dll delphi-xe


【解决方案1】:

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

首先,重要的是要知道 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,像往常一样,explains how to use it correctly

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

【讨论】:

  • 这看起来对吗? dwMode := SetErrorMode(SEM_FAILCRITICALERRORS);尝试//最后这里容易出错的代码 SetErrorMode(dwMode);结尾;你知道我会如何在同一个调用中忽略 SEM_NOGPFAULTERRORBOX 和 SEM_FAILCRITICALERRORS 吗?
  • 我会在启动时这样做:dwMode := SetErrorMode(SEM_FAILCRITICALERRORS); SetErrorMode(dwMode 或 SEM_FAILCRITICALERRORS);有帮助吗?
  • 是的,很抱歉,当您调用 dwMode:= SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); ?我不确定如何在 delphi 中将两者结合起来。
  • |是逻辑的或在 C++ 中。这就是 Delphi 中的 or 运算符。使用我之前评论中的代码。 SetErrorMode 能解决你的问题吗?
  • 超级老,但在工作中拯救了我的一天。感谢 DependencyWalker 提示。发现AVIFIL32.dll 正在导入使用_ftoll2_sseVSCRT.dll。由于我为我的视频使用 X-Vid 编解码器,我可以从我的安装程序中排除这种依赖关系,然后它就可以工作了。
猜你喜欢
  • 2023-04-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 2011-04-27
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多