【问题标题】:VC++ Runtime to terminate it in an unusual wayVC++ 运行时以不寻常的方式终止它
【发布时间】:2013-02-21 02:58:00
【问题描述】:

我的非托管 VC++ MFC(不使用 .NET,不支持 CLR,在共享 DLL 中使用 MFC)应用程序尝试将可视 C++ 运行时文件部署为私有程序集。

它在 Windows 7 全新安装的计算机上正常运行。 但是我在新安装的 windows XP sp3 计算机中给出了“This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.” 错误。

我检查了应用程序事件日志。但也没有更多细节,只是显示同样的错误。

然后我阅读了这些主题并在互联网上冲浪。

Thread - 1 Thread - 2 Article -1

但找不到任何解决线索或故障排除方法。所以在这里寻求帮助。

【问题讨论】:

  • 您的程序调用了 terminate() 函数。通常是因为未处理的异常。您需要对其进行调试。
  • 如何在没有 Visual Studio 的新 windows XP 机器上调试?
  • 删除了 winrt 标签,因为这个问题与 Windows 8 无关。

标签: visual-c++ runtime-error


【解决方案1】:

最简单的测试方法是在电脑上安装depends。很可能,您的应用程序是为使用更高版本的 C++ 运行时库而构建的,例如<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />,但在 XP 系统上是旧版本。

您需要通过分析程序的清单来检查使用的运行时库的版本。然后检查依赖显示的内容。

如果缺少所需的运行时版本,请将其与程序的安装一起分发。

另外,您可以考虑切换到静态链接。二进制文件的大小会更大,但这些类型的问题会消失

【讨论】:

  • 实际上我之前已经尝试过静态链接,但我的应用程序包含第三方提供的 DLL 和 LIB 数量。因此,静态链接主要与最终构建与多个运行时版本相冲突。其次编译计算机CRT版本是9.0.30729.1,我定义_BIND_TO_CURRENT_VCLIBS_VERSION=1在编译时使用它。当我在 Windows XP 计算机中分析我的应用程序时,它会显示此错误 GetProcAddress(0x7C800000 [KERNEL32.DLL], "FlsAlloc") called from "MSVCR90.DLL" at address 0x78543ACC and returned NULL. Error: The specified procedure could not be found (127).
  • 感谢您的回复。我猜第三方提供的一个 DLL 可能会使用其他版本的MSVCR90.DLL 所以有什么办法找到它吗?并且供您参考,此应用程序不应使用 Win XP 计算机中存在的 C++ 运行时程序集。这就是为什么我将所有必要的程序集与可视 C++ 运行时文件一起部署为私有程序集
  • 只需用visual studio打开第三方dll(是的,你可以做到)。打开resource->RT_Manifest,看看它与什么链接。然后分发crt。 Depends 也会显示这一点
  • 感谢您的想法。我使用旧版本的 CRT 9.0.21022.8 找到了 libeay32.dll,但我只能在我的应用程序目录中部署一个版本的程序集集。知道如何解决吗?
  • 您确定要分发所有程序集吗?尝试从 MS 网站下载 vs_redist。 Windows操作系统的winsxs机制应该是自己将旧版本的条目重定向到新版本
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多