Visual Studio 2010 Win32 App无法在Windows XP上启动

时间:2012-02-03 07:03:55

标签: c++ visual-studio-2010 winapi windows-xp

我必须编写一个具有一些特定要求的简单应用程序:
它应该只包含一个exe文件,没有安装程序或外部DLL 它应该是小的 3.它应该在任何Windows(Win32)平台上运行(至少在Windows XP上),而不对Windows安装进行任何修改(不依赖于.NET,JVM,MFC或Visual Studio可再发行组件)
它应该有一个简单的(基于对话框的)UI

我决定在C(C ++)中使用简单的Win32应用程序,只使用标准的win32 api,没有花哨的东西。我在64位Windows 7上使用Visual Studio 2010创建了项目,并将运行时库从多线程DLL更改为仅多线程。我认为这可以产生最兼容Windows的应用程序。

已编译的应用程序在我的Windows 7上正常运行,但我无法在任何Windows XP PC上启动它。我在Windows XP SP2和SP3上都试过了。奇怪的是,我没有在活动管理器中收到任何错误消息和流氓进程,当我双击exe文件时没有任何反应。并且没有生成DrWatson日志。

我在项目设置中检查了目标机器,它是MachineX86。

我已经搜索了很多关于这个问题的文章,其中一个提示是修改targetver.h,我没有结果。这就是我的targetver.h现在的样子:

#include <WinSDKVer.h>
#define _WIN32_WINNT      _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

我也尝试过依赖漫步者,但它只显示了一个名为DWMAPI.DLL的延迟加载DLL,它似乎是一个Vista DLL。还有两个其他延迟加载的DLL,MPR.DLL和SHLWAPI.DLL的警告。但由于它们是延迟加载的,我不认为我在其中使用任何东西它应该没关系(谷歌搜索显示这些警告应该被忽视)。

我的目标是能够编译一个可以在XP机器上运行的exe而无需对它们进行任何修改。

3 个答案:

答案 0 :(得分:1)

我解决了这个问题。当我说我没有花哨的东西作为普通的Win32时,它并不完全正确。在现代操作系统上运行时,我不想要在XP之前的外观和感觉,所以我将这些行添加到stdafx.h(根据我在网上找到的提示):

#define ISOLATION_AWARE_ENABLED 1
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

我没有提到这个的原因是我已经尝试删除这些行,但它仍然无效(我仍然无法理解为什么当我删除这些行时它不起作用,我尝试了不止一次)。

但是在更多阅读MSDN文章后,我发现这些行必须在windows.h的包含之前,所以我移动它,现在它可以工作(使用经典和xp风格)

所以问题似乎是我在Windows的包含的错误方面更改为ComCtl32的第6版,但我仍然不知道为什么当我删除这些行时它不起作用。 Windows可以以某种方式缓存清单吗?

答案 1 :(得分:0)

也许你需要在XP机器上使用它:MSVC 2010 runtime

答案 2 :(得分:0)

尝试创建静态链接到C运行时库的程序。

在解决方案中的项目中执行以下操作:转到“属性”|配置| C / C ++ |代码生成|运行时库。

发布:将/ MD更改为/ MT,多线程。 调试:将/ MDd更改为/ MTd,调试多线程。

如果要继续使用动态链接,请按照@dbrank()的建议将MSVC ++运行时文件复制到XP计算机中。但是,您在原始帖子中声明您需要一个独立的.exe,而不需要复制额外的文件。