我必须编写一个具有一些特定需求的简单应用程序:
我决定用C (C++)编写一个简单的Win32应用程序,并且只使用标准的win32应用程序接口,没有花哨的东西。我在64位Windows 7上用Visual Studio2010创建了这个项目,并将运行时库从多线程DLL更改为多线程。我认为这将产生最兼容Windows的应用程序。
编译后的应用程序在我的Windows7上运行良好,但我无法在任何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,它看起来像是一个Vista动态链接库。还有另外两个延迟加载的动态链接库MPR.DLL和SHLWAPI.DLL的警告。但由于它们是延迟加载的,而且我不认为我在其中使用了任何东西,所以这无关紧要(谷歌一下就会发现这些警告应该被忽略)。
我的目标是能够编译一个可以在XP机器上工作的可执行文件,而不需要对它们进行任何修改。
发布于 2012-02-07 15:21:45
我解决了这个问题。当我说我做的是普通的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的include之前,所以我移动了它,现在它可以工作了(经典和xp风格)
所以问题似乎是我在windows.h的include的错误一侧更改到了ComCtl32的版本6,但我仍然不知道为什么当我删除这些行时它不起作用。Windows会以某种方式缓存清单吗?
发布于 2012-02-03 15:14:24
也许你在XP机器上需要这个:MSVC 2010 runtime
发布于 2012-02-03 15:15:29
尝试创建静态链接到C运行时库的程序。
在解决方案中的项目中执行以下操作:转到属性|配置| C/C++ |代码生成|运行时库。
发布:将/MD更改为/MT,多线程。调试:将/MDd更改为/MTd,调试多线程。
如果您想继续使用动态链接,请按照@dbrank()的建议将MSVC++运行时文件复制到您的XP计算机中。然而,你在最初的帖子中表示,你想要一个独立的.exe,而不需要复制额外的文件。
https://stackoverflow.com/questions/9124902
复制相似问题