由于VS2010的运行库使用了EncodePointer等只有XP SP2以上的系统才支持的API,所以VS2010编译出来的程序无法在XP SP2以下的系统运行,不论是Win32程序还是MFC程序都不行,另试过如下方法,也都不行:1、链接非DLL运行库(/MT、/MTd),不行2、静态链接MFC,不行3、定义WINVER、_WIN32_WINNT为0x0500,不行请问有什么方法可以让VS2010编译出来的程序运行在XP SP2以下的系统,最好是简单的方法,诸如替换link.exe、.lib的方法就不用了。

解决方案 »

  1.   

    有这种事?还没用VS 2K10,关注
      

  2.   

    在targetver.h或stdafx.h中把WINVER等4个常量宏的值改小一点就行了,具体数值请参见:
    http://msdn.microsoft.com/en-us/library/ms724832(v=VS.85).aspx
      

  3.   

    是不是缺少什么DLL了,编一个hello world的控制台程序试试。没用过2010纯猜测。
      

  4.   


    却有此事!
    打啥补丁?如果是系统补丁就算了,别人用户的系统不一定都会去打补丁。
    试过了,空的控制台程序,只有main(),其它什么都没调用,也不能运行在XP SP2以下,用工具查看编译出来的exe发现自动导入了EncodePointer等XP SP2以上才支持的API,关键就是怎么让它不导入这些API。
      

  5.   

    是不是没带运行时一起发布?
    先装VC10运行时
    http://www.dtechgadget.com/visual-c-2010-runtime-redistributable-package-x86-x64-ia64-free-download/
      

  6.   

    看了一下targetver.h中有这样的注释:#pragma once// 包括 SDKDDKVer.h 将定义最高版本的可用 Windows 平台。// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
    // WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。#include <SDKDDKVer.h>
      

  7.   


    问题是VC++ 2010 Redistributable Package在2000 SP4下都装不上,提示错误和VS2010编译出来的程序一样
      

  8.   


    我在顶楼已经说明过了:3、定义WINVER、_WIN32_WINNT为0x0500,不行
      

  9.   

    1。 看一下EncodePointer等函数都在什么系统dll里,然后把这些DLL随版本发布
    2。 打开编出来的EXE,从里面直接把导入函数EncodePointer等删除掉
      

  10.   


    只要能确定运行库没调用这些函数,修改生成执行文件的导出表,将此EncodePointer等函数删除应该可以。或一起发布带EncodePointer等函数的系统dll
    实在不行就要求软件运行在xp sp2 以上系统吧。还好微软没要求vista以上系统,要不更郁闷。
      

  11.   

    EncodePointer 在 winxp sp2 上的 Kernel32.dll 才有,sp2 以前还真没法用
      

  12.   

    那你不用vs2010就可以了嘛,别人新的产品不可能永远都支持以前的旧的吧,
    就象当年xp刚出来,也不是很多程序不兼容嘛,这么多年了,还是过了,没人用98了吧,难道你还需要编译win98上面的程序
      

  13.   

    一个比较靠谱的方法是,用vc10编译,但使用vc9的runtime
      

  14.   

    不会啊  我前几天写了个自动更换桌面程序拿到我朋友的机器上也能用(XP SP2) MFC VS2010
      

  15.   


    EncodePointer在kernel32.dll里,这个DLL也随产品发布就……
    另EncodePointer只是举个例子,不止这一个API,而且CRT里会要调用它(比如VC\crt\src\onexit.c第145行),所以在成品的exe里删除EncodePointer不是办法。
    咋个弄?
    注意看帖!!编译出来的程序怎么在XP SP2以下的系统运行
      

  16.   


    98不是考虑的对象,但就目前的市场来看,考虑2000 SP4和XP SP1还是很正常的吧,尤其是一些网吧喜欢用XP SP1。要是为了这个而不能用VS2010,那VS2010就有点悲剧了。
      

  17.   

    http://blogs.msdn.com/b/vcblog/archive/2009/12/08/c-native-multi-targeting.aspx再把vc9的cl.exe等换成vc10的应该可以,类似换intel编译器的方法
      

  18.   

    这个看起来可行!而且VS2010有直接的设置项,不用手动去替换cl.exe。不过要求电脑同时装有VS2008,回头再装上试试,十分感谢!
      

  19.   

    cl不替换是可以的,不过不能用auto等c++的新特性了
      

  20.   

    好贴留名
    貌似,用VS2008部署的时候麻烦一些,vs2010可以直接拷贝dll
      

  21.   

    哈哈,微软牛,一句不再提供Win2K支持了事。
    http://connect.microsoft.com/VisualStudio/feedback/details/473978/vs2010s-c-runtime-library-introduces-dependencies-which-prevent-execution-on-windows-2k
      

  22.   

    我靠  还有这种事情,还真没用过VC10,一直是VC6和VC9混着用的
      

  23.   

    机器上同时安装了2008和2010,试用了一下,实在是不喜欢2010,对于VC开发没有明显的进步,智能提示根本比不上VA好用,整个界面风格像坟墓,跟BLEND一个球样,不适合长期写代码,虽说可能可以切换,但默认就应该搞一个让人舒服的色调,内存占用就懒得提了,helplib也让人难以接受。先放在那吧,也许以后有用,反正500G的硬盘也不在乎它那点空间,好长一段时间内还是用2008。
      

  24.   


    那当初xp刚出来时呢?所有网吧不是用98系统吗?
    再说了,vs2010的新特性,是针对vista以后版本的噎
      

  25.   

    http://weblogs.asp.net/israelio/archive/2009/10/20/enable-vs-2010-multi-targeting-also-for-vs2005-c.aspx参考这个,研究一下props文件,或许可以改造一个使用vc10编译器,vc9crt的平台设置
    我没试过,仅供参考
      

  26.   


    我拿网吧来举例,要表达的意思是现在还有不少人在用XP SP1,所以现在做程序的考虑支持XP SP1是很正常的,网吧啥时候用啥系统不是重点。另,明显你没了解过VS2010,对于C++来说,VS2010最重要的新特性就是关于C++ 0x语言的,比如auto关键字、Lambda表达式等,这些和Vista根本就不沾边。
      

  27.   

    微软就没打算让你的程序在低级版本的系统上运行,要是能在低级版本上运行了,谁还买Window 7啊~!
      

  28.   

    Visual Studio 2010 可以安装在以下操作系统上:    * Windows XP (x86) Service Pack 3 - 除 Starter Edition 之外的所有版本
        * Windows Vista (x86 & x64) Service Pack 1 - 除 Starter Edition 之外的所有版本
        * Windows 7 (x86 & x64)
        * Windows Server 2003 (x86 & x64) Service Pack 2
        * Windows Server 2003 R2 (x86 & x64)
        * Windows Server 2008 (x86 & x64) Service Pack 2
        * Windows Server 2008 R2 (x64)支持的体系结构:    * 32 位 (x86)
        * 64 位 (x64)
    详细可见
    http://www.microsoft.com/visualstudio/zh-cn/products/2010-editions/professional
      

  29.   

    这不算硬伤吧?旧的不去新的不来,如果大家都一直不放弃XP一下的那些东东,
    Win7卖谁去? 微软的本质是一家商业公司,他的所有目标只有一个就是盈利,
    这是本质。
      

  30.   


    他说的"在XP SP2以下"精确的说是"低于XP SP2"
      

  31.   

    工具是哪个适合用哪个。你的软件的执行结果依赖于MS,如果你不换个方式搞,你会浪费很多时间。使vs2010编译的东西保证运行在xpsp1及以下系统??
    用vs2008也半年了,我听着都有点神奇。。强制用户打补丁,要不就自己花费时间实现底层的东西。
      

  32.   

    计划没有“变化”快呀...
    当年2005还支持98系统,2008就开始不支持了,2010就部分的支持xp了,后面呢,也许2012只能部分的支持windows 8了,后面的 20xx 就不支持刚出的新系统上,而要等下一代研发完毕才能运行了
      

  33.   

    试了一下,禁止连接运行库,编译出来的代码就可以在xp以下的系统运行。
    默认的win32工程 稍作修改,依赖的函数如下
      kernel32.dll
    GetModuleHandleW
      user32.dll
    BeginPaint
    CreateWindowExW
    DefWindowProcW
    DestroyWindow
    DialogBoxParamW
    DispatchMessageW
    EndDialog
    EndPaint
    GetMessageW
    LoadAcceleratorsW
    LoadCursorW
    LoadIconW
    LoadStringW
    PostQuitMessage
    RegisterClassExW
    ShowWindow
    TranslateAcceleratorW
    TranslateMessage
    UpdateWindow
      

  34.   

    既然用了vs2010,有了新的属性,就要付出一些额外的条件我觉得ms不会犯这种低级错误,还是新产品发布,大家不熟悉导致的建议楼主用2010自带的msi打一个包看看,把以来的运行时库都塞进去,应该就可以了
      

  35.   

    1。这样好象就无法使用C++0x技术编码。2。window模式(非控制台的)的程序怎样弄?
      

  36.   

    前面有人说过连接crt9的运行时的问题,crt9是不支持C++0x的
      

  37.   

    使用Windows SDK的函数时,仔细阅读MSDN最后的Requirements,其中的Client、Server就指明了该函数有效的Windows版本范围,一般是下限说明,所以低于下限版本时,就无解了。并且,如果该函数是在系统的DLL中,你无法通过替换来解决,因为这可能导致系统不稳定。
    解决的方法只有自己实现一个可以完成该功能的函数,在不满足系统最小条件时使用自己的函数来完成。
      

  38.   

    不知道楼主用的什么VS2010,我用正式版的,XP SP2没任何问题,SP1不能运行,我的XP SP2是虚拟机纯净安装原版无任何补丁版本
      

  39.   

    所以我一直用VC6+VA.
    这厮开发出来的东西,从Win95->Win7,基本不存在什么兼容性问题.
    更不存在这种发布时的弱智问题.
    当然, 哪天, WIN7到了60%的占有率的时候, 也是我们更换开发工具的时候了.
      

  40.   


    我觉得这种通过降低WINVER值的方式应该是正解.
      

  41.   

    http://blog.vckbase.com/BastEt/archive/2010/07/20/50718.html
    静态C库链接有办法了。
      

  42.   

    怎么我用vs2010编译的程序(win32 sdk)可以在xp sp2 下运行, 将
    "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
    拿去在xp下运行完就可以了.
      

  43.   

    [Quote=引用 73 楼 wudging 的回复:]
    怎么我用vs2010编译的程序(win32 sdk)可以在xp sp2 下运行, 将
    "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
    拿去在xp下运行完就可以了.
    [/Quot  Xp中没有文件夹  。\Bootstrapper\Packages\vcredist_x86\   啊 
      

  44.   

    我了也遇到此问题,升级编译器到vc2010之后,支持的最小系统就仅仅是xp sp2了
      

  45.   

    网上看到的方法:
    .686p  
    .model flat, stdcall
    public _imp__DecodePointer@4
    public _imp__EncodePointer@4
    .data
    _imp__DecodePointer@4 dq dummy32
    _imp__EncodePointer@4 dq dummy32
    .code
    dummy32 PROC p: DWORD
    mov eax, p
    ret sizeof(DWORD)
    dummy32 ENDP
    endvs2010编译的程序无法在XP SP2以前的平台上运行,这是由于MS在处理(有可能有意)库函数的时候出现了问题,试过多种解决方案,最后还是得上汇编,把上面的代码保存成vs10port.asm加到项目中用masm编译然后生成的obj和主程序链在一起即可。
      

  46.   

    楼上方法那么神奇,都搞到汇编去了,现在vs2012编译的mfc连xp都跑不了了