如何能使VS2012开发的程序在XP上运行

2024-01-30 17:04:31 来源:华启智能

通常情况下VS2012开发的程序是不能再XP系统上运行的,会报错不是有效的Win32程序。本文介绍如何实现VS2012开发的程序在XP上运行。
  1.背景
最近用VS2012写了程序,功能实现后在Win10系统上可以正常运行,到XP系统运行报错:不是有效的Win32应用程序。确认了是Win32平台啊,咋不能运行呢。这事以前也遇到,就回到XP用VC6编译一下也能行。这次到网上搜索了一下,最终是VS2012开发的程序在XP上运行。

2.为啥VS2012开发的程序在Win10能运行,XP就运行不了?
这一切都源于微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序仅仅能在Vista/Win7/Win8上执行。但幸好还保留了生成XP程序的设置项。XP和Win2003的用户还是存在的。

3.如何能使VS2012开发的程序在XP上运行?
网上搜出来,说平台工具集使用Visual Studio 2012 - Windows XP (v110_xp),VS2013可以选择Visual Studio 2013 - Windows XP (v100_xp).

我一开始安装的VS2010版本打开后发现没有Visual Studio 2012 - Windows XP (v110_xp)选项,咋办?升级呗。网络上说需要Update1以上才有这个选择,现在(2024年1月29日)微软网站最新版本是Update5,下载安装就可以。
微软网站链接:
Visual Studio 2012 Update 5介绍
https://support.microsoft.com/en-us/topic/visual-studio-2012-update-5-0eb799e7-c01b-c935-d09e-956cdeb938f0
下载Update5
https://my.visualstudio.com/Downloads?pid=1862

下载后是一个ISO文件,我下载的是mu_visual_studio_2012_update_5_x86_dvd_6967467.iso 大小2.36G.

安装很容易,安装完成后我的VS中就出现了Visual Studio 2012 - Windows XP (v110_xp)。

需要操作步骤是这样的:
A. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;
B. 项目菜单->项目属性->配置属性->常规->MFC的使用。选择在静态库中使用MFC;
C. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗体windows(依据你的项目类型选择),第二项版本设成5.01。
D. C/C++->代码生成->执行库,选择“多线程调试(/MTd)";

4.处理错误
这样设置完之后,单击生成解决方案或者生成项目,会报错,最重要的是报错:

1>ClCompile:
1>  StdAfx.cpp
1>  _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\atlcore.h(632): error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”: 未声明的标识符
1>
1>生成失败。

error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”

关于这个报错网上很多说法没解决我遇到的报错。

inline HMODULE AtlLoadSystemLibraryUsingFullPath(_In_z_ const WCHAR *pszLibrary)
{
#if (NTDDI_VERSION >= NTDDI_WIN8)
return(::LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32));
#else
WCHAR wszLoadPath[MAX_PATH+1];
if (::GetSystemDirectoryW(wszLoadPath, _countof(wszLoadPath)) == 0)
{
return NULL;
}

关键可以看到 NTDDI_VERSION >= NTDDI_WIN8 这个表达式,既然选择了编译到 WINXP 这个表达式如何也不可能成立呀。

//-----------------以下为引用----------------------------

逐一打印 发现 NTDDI_VERSION,和 NTDDI_WIN8, 居然 NTDDI_WIN8 是空。此时再分析一下,就找到问题了:
- 使用Platform Tool 为 110_xp 时指向C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A
- 使用Platform Tool 为 110 的时候 C:\Program Files (x86)\Windows Kits\8.0
- 而 NTDDI_WIN8 在 v7.1A 版本中 没有定义,只定义到 NTDDI_WIN7。
接下来就好办了问题原因找到了,那么自然就好办了。

方法一:
在 stdafx.h 中在调用 atlbase.h 之前,加入对 NTDDI_WIN8 的定义。

#ifndef NTDDI_WIN8
#define NTDDI_WIN8       0x06020000
#endif 

方法二:
直接修改 v7.1A 的版本的 SDKDDKVer.h line 131

#define NTDDI_WIN8 0x06020000
-------------------------------------------------引用结束-------------------------------------
我采取是方法二,修改 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\SDKDDKVer.h

5.测试生成成功

1>生成成功。
1>
 
1>已用时间 00:00:15.26
生成的程序到XP系统可以正常运行。

参考资料:
标签:VS

相关文章

站内搜索

产品分类

推荐分类

联系我们

  • 点击联系  点击联系
  • 联系华启智能