为什么我的应用程序在Win XP上崩溃,除非我安装VS2005运行时?

时间:2011-11-06 22:40:46

标签: visual-c++ access-violation

我正在尝试调查为什么我的应用程序(在VC 2008中编写)崩溃在 Windows XP和c0000005上。它适用于任何Windows Vista和7.在XP上它会崩溃,没有其他信息。以下是我头痛的几天的细节和结果,消除了一个接一个的原因。这是详细信息:

  • 我使用带有iexplore 6的XP模式的Win7终极版,可能没有任何补丁。

  • 我安装了我的程序,没有别的,因为它应该是安装并运行的东西,不需要额外的包。

  • 我的应用已编译VC2008运行时(使用/ MT,而不是/ MD编译器开关)

  • 我正在使用firebird embedded,无论如何都需要 VC2005 (编辑,我之前写过VC2008) libs,所以我把它们放在我的应用程序中工作目录

  • 当我在这台XP Mode机器上安装VC ++ 2008时,它不再崩溃,所以不可能以这种方式调试

  • 我已将此错误的发生范围缩小到VC2005运行时 - 在我安装它之后,我的应用程序停止崩溃。但我不知道什么可以使用它的组件。在VC2008 IDE下运行发布版本时,没有任何内容显示正在加载任何vc2005库(很奇怪,如果我自己这样说的话)。

我的应用程序链接器的依赖项列出了这些(我只添加了前两个,其余部分由VisualStudio提供):jpeg.lib,gdiplus.lib,kernel32.lib,user32.lib,gdi32.lib,winspool.lib, comdlg32.lib,advapi32.lib,shell32.lib,ole32.lib,oleaut32.lib,uuid.lib,odbc32.lib,odbccp32.lib,comctl32.lib,%(AdditionalDependencies)

我也在使用IBPP firebird接口,它动态加载它们,因此它们存在于我的应用程序的目录中(它们需要msvc?80.dlls): fbembed.dll,ib_util.dll,icudt30.dll,icuin30.dll,icuuc30.dll,msvcp80.dll,msvcr80.dll

请告知为什么vc2005运行时可以解决我的应用程序在裸Win XP上崩溃的问题。或者如何在不在目标机器上安装vc 2008的情况下调试那个。我开始责怪windows xp的组件。最终,我希望我的应用程序不需要任何其他软件包,例如VC2008或2005,特别是当我的应用程序的任何组件都不需要后者时。

1 个答案:

答案 0 :(得分:2)

  

我也在使用IBPP firebird接口... msvcp80.dll,msvcr80.dll

答案在你的问题中,这些DLL是VS2005运行时支持DLL。它们不能存储在您的exe目录中,它们必须在并行缓存中注册。这通常不会导致AV,但如果代码不检查LoadLibrary()的返回值,则不是不可能的。您可以为他们from Microsoft下载安装程序。它没有与Windows XP有任何关系,你碰巧尝试在已经安装了DLL的机器上运行该程序。例如,在开发机器上非常常见。

如果您不想依赖它们,那么您将不得不重建那些需要它的DLL。这是一个好主意,依赖于多个版本的CRT是非常不健康的。

如果您想知道为什么要处理这个问题:微软试图将DLL Hell放在开发人员的一圈而不是用户的手中。他们已经撤回了这个,VS2010再次成为一个用户问题。这是班加罗尔的一个非常大的聚会,我想。