由于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的方法就不用了。
解决方案 »
- WTL为什么::FlatSB_EnableScrollBar,::FlatSB_SetScrollProp...无效?返回0失败
- Application Hang 挂起应用程序,什么原因引起的?
- 如何解决使用waitforsingleobject()后主线程假死的情况?
- 请教!!怎样在LISTVIEW中实现图片的预览功能
- 关于窗口创建时产生WM_CREATE的问题
- 在主窗口中能显示文本吗?
- 控制方案---请教
- 〉〉一个基本问题,标准c和c++中有分别有哪些基本(build-in)数据类型??
- 如何移动edit控件,使用什么函数?谢谢
- 线程同步问题,急等!!!!
- 如何定义一个宏不使用mfc而使用自定义的?//自定义类与MFC的类重名
- 位图打包问题
http://msdn.microsoft.com/en-us/library/ms724832(v=VS.85).aspx
却有此事!
打啥补丁?如果是系统补丁就算了,别人用户的系统不一定都会去打补丁。
试过了,空的控制台程序,只有main(),其它什么都没调用,也不能运行在XP SP2以下,用工具查看编译出来的exe发现自动导入了EncodePointer等XP SP2以上才支持的API,关键就是怎么让它不导入这些API。
先装VC10运行时
http://www.dtechgadget.com/visual-c-2010-runtime-redistributable-package-x86-x64-ia64-free-download/
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。#include <SDKDDKVer.h>
问题是VC++ 2010 Redistributable Package在2000 SP4下都装不上,提示错误和VS2010编译出来的程序一样
我在顶楼已经说明过了:3、定义WINVER、_WIN32_WINNT为0x0500,不行
2。 打开编出来的EXE,从里面直接把导入函数EncodePointer等删除掉
只要能确定运行库没调用这些函数,修改生成执行文件的导出表,将此EncodePointer等函数删除应该可以。或一起发布带EncodePointer等函数的系统dll
实在不行就要求软件运行在xp sp2 以上系统吧。还好微软没要求vista以上系统,要不更郁闷。
就象当年xp刚出来,也不是很多程序不兼容嘛,这么多年了,还是过了,没人用98了吧,难道你还需要编译win98上面的程序
EncodePointer在kernel32.dll里,这个DLL也随产品发布就……
另EncodePointer只是举个例子,不止这一个API,而且CRT里会要调用它(比如VC\crt\src\onexit.c第145行),所以在成品的exe里删除EncodePointer不是办法。
咋个弄?
注意看帖!!编译出来的程序怎么在XP SP2以下的系统运行
98不是考虑的对象,但就目前的市场来看,考虑2000 SP4和XP SP1还是很正常的吧,尤其是一些网吧喜欢用XP SP1。要是为了这个而不能用VS2010,那VS2010就有点悲剧了。
貌似,用VS2008部署的时候麻烦一些,vs2010可以直接拷贝dll
http://connect.microsoft.com/VisualStudio/feedback/details/473978/vs2010s-c-runtime-library-introduces-dependencies-which-prevent-execution-on-windows-2k
那当初xp刚出来时呢?所有网吧不是用98系统吗?
再说了,vs2010的新特性,是针对vista以后版本的噎
我没试过,仅供参考
我拿网吧来举例,要表达的意思是现在还有不少人在用XP SP1,所以现在做程序的考虑支持XP SP1是很正常的,网吧啥时候用啥系统不是重点。另,明显你没了解过VS2010,对于C++来说,VS2010最重要的新特性就是关于C++ 0x语言的,比如auto关键字、Lambda表达式等,这些和Vista根本就不沾边。
* 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
Win7卖谁去? 微软的本质是一家商业公司,他的所有目标只有一个就是盈利,
这是本质。
他说的"在XP SP2以下"精确的说是"低于XP SP2"
用vs2008也半年了,我听着都有点神奇。。强制用户打补丁,要不就自己花费时间实现底层的东西。
当年2005还支持98系统,2008就开始不支持了,2010就部分的支持xp了,后面呢,也许2012只能部分的支持windows 8了,后面的 20xx 就不支持刚出的新系统上,而要等下一代研发完毕才能运行了
默认的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
解决的方法只有自己实现一个可以完成该功能的函数,在不满足系统最小条件时使用自己的函数来完成。
这厮开发出来的东西,从Win95->Win7,基本不存在什么兼容性问题.
更不存在这种发布时的弱智问题.
当然, 哪天, WIN7到了60%的占有率的时候, 也是我们更换开发工具的时候了.
我觉得这种通过降低WINVER值的方式应该是正解.
静态C库链接有办法了。
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
拿去在xp下运行完就可以了.
怎么我用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\ 啊
.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和主程序链在一起即可。