1.尽量避免使用GetVersion函数
Windows 7 和 Windows Server 2008 R2 的内部版本号是 6.1。
进行版本检查时尽量用"<"号代替!=号,这样可以允许应用程序在更新版本的操作系统中运行。最低要求是,应用程序应该总是接受大于等于最低的受支持的操作系统版本号。
C++
a.通过GetVersionEx获取版本号来判断
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
bIsWindowsXPorLater = ( (osvi.dwMajorVersion > 5) ||
( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) ));
b.通过VerifyVersionInfo来直接检测
OSVERSIONINFOEX osvi;
BOOL bIsWindowsXPorLater;
DWORDLONG dwlConditionMask = 0;
int op=VER_GREATER_EQUAL;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 5;
osvi.dwMinorVersion = 1;
osvi.wServicePackMajor = 2;
osvi.wServicePackMinor = 0;
VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, op );
VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, op );
VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMAJOR, op );
VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMINOR, op );
bIsWindowsXPorLater = VerifyVersionInfo(
&osvi,
VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
dwlConditionMask);
C#
if (Environment.OSVersion.Version < new Version(5, 1))
{
MessageBox.Show("Windows XP or later required.",
"Incompatible Operating System", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
当某功能在不同平台下有差异时,应用程序不应该执行操作系统版本检查。如果需要特定的功能 , 最好尝试查找该功能 , 只有在找不到该功能的时候才会失败。
C++
使用GetProcAddress()来判断函数是否存在。
C#
try{
FunctioninHighVersion();
}
catch (EntryPointNotFoundException)
{
FunctioninLowVersion();
}
2.Win7不再支持 Windows Mail和Windows Movie Maker
3.win7不再支持Microsoft Agent
Microsoft Agent是一种基于微软视窗平台的可编程的即时交互性动画角色。开发人员能够用该角色作为助手介绍,向导,娱乐或作为一种加强网站及应用程序交互性开发的手段。 Microsoft Agent能使程序员和网站开发者设计出更加人性化的用户交互界面。除了可以接受键盘和鼠标的输入外, Microsoft Agent还可以听懂用户的语音命令,动画角色会根椐用户的准标语音命令通过同步语音,录音或文本框作出相应的回馈。
Win7不再支持Microsoft Agent,但是仍然可以到微软官网下载修复补丁以支持该功能。
4.使用Trident来判断IE版本
IE8及以上版本使用兼容模式时,user-agent的version token将显示其兼容的版本。这时需要根据Trident来判断IE的版本。
比如IE8,不用兼容模式时version token为MSIE 8.0,与IE7兼容的话version token为MSIE 7.0,但是会附加Trident/4.0字符串来表明当前IE是IE8,另外Trident/5.0对应IE9,Trident/6.0对应IE10
5.移除了注册表反射机制
Windows Server 2008, Windows Vista, Windows Server 2003, 和Windows XP系统都用反射机制来同步32位和64位注册表。但是从Windows 7和Windows Server 2008 R2开始,MS移除了注册表反射,融入了反射键。
6.MSMQ默认使用SHA-2签名
这样将导致Win7和低版本中的MSMQ不兼容。
7.UAC数据重定向
当应用程序需要对系统目录或者注册表进行写入操作,但却没有相应的权限时,UAC数据重定向会将数据写入一个虚拟化的路径中,这时当切换到其他用户或启动或禁止UAC时将无法访问之前写入的数据。
所以开发应用程序的时候,不应该对敏感的系统区域进行写入操作,应该始终考虑使其运行在标准用户的权限下,而不是在管理员权限下运行。
当必须要写入系统目录或需要特殊权限的位置时,可以将项目设置为requireAdministrator的,这样应用程序在运行时可以获取管理员权限。