我一直在使用GetVersionEx
,但它在运行 Windows 8.1 的机器上失败了。在查看了一些信息后发现GetVersionEx
自 8.1 版本以来已弃用。
我想问在哪里可以找到已弃用 API 的完整列表,因为我不想再使用它了。
编辑:我不是要使用什么来代替GetVersionEx
,我要的是已弃用 API 的完整列表。
我一直在使用GetVersionEx
,但它在运行 Windows 8.1 的机器上失败了。在查看了一些信息后发现GetVersionEx
自 8.1 版本以来已弃用。
我想问在哪里可以找到已弃用 API 的完整列表,因为我不想再使用它了。
编辑:我不是要使用什么来代替GetVersionEx
,我要的是已弃用 API 的完整列表。
微软已经描述了Windows 8.1 和 Windows Server 2012 R2 中操作系统版本变化的变化。在文章的左侧,您可以导航到与Windows 8.1 和 Windows Server 2012 R2 客户端和服务器兼容性相关的其他问题。
您遇到的行为如下:
在 Windows 8.1 中,GetVersion(Ex) API 已被弃用。这意味着虽然您仍然可以调用 API,但如果您的应用程序没有专门针对 Windows 8.1,您将获得 Windows 8 版本控制 (6.2.0.0)。
另一个论坛上的某个人向我指出了这种方法。
在应用程序清单文件中包含您的 Windows 8.1 操作系统 GUID
您的 .manifest 应包括 Windows 8.1。看起来像这样。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--This Id value indicates the application supports Windows 8.1 functionality-->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
这种方法的一个问题是您的旧二进制文件将始终在 Windows 8.1 和更高版本的 Windows 版本上显示错误的 Windows 版本。
这种方法的另一个问题是GetVersionEx API 仍然被弃用,因此您将无法以 Visual Studio 2013 平台工具集为目标。您必须将您的平台工具集设置为 Visual Studio 2012 或更低版本。
更新:其实我记得你可以使用这样的东西禁用它。
#pragma warning (disable : 4996)
versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
POSVERSIONINFO pVersionInfo = (POSVERSIONINFO)&versionInfo;
if (::GetVersionEx(pVersionInfo))
{
if (6 == versionInfo.dwMajorVersion && 3 == versionInfo.dwMinorVersion)
{
wcout << _T("Windows 8.1 Detected") << endl;
}
else if (6 == versionInfo.dwMajorVersion && 2 == versionInfo.dwMinorVersion)
{
wcout << _T("Windows 8.0 Detected") << endl;
}
}
#pragma warning (default : 4996)
您也可以使用 NetWkstaGetInfo API 来获取本地机器的版本。
bool GetWindowsVersion(DWORD& major, DWORD& minor)
{
LPBYTE pinfoRawData;
if (NERR_Success == NetWkstaGetInfo(NULL, 100, &pinfoRawData))
{
WKSTA_INFO_100 * pworkstationInfo = (WKSTA_INFO_100 *)pinfoRawData;
major = pworkstationInfo->wki100_ver_major;
minor = pworkstationInfo->wki100_ver_minor;
::NetApiBufferFree(pinfoRawData);
return true;
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD major = 0;
DWORD minor = 0;
if (GetWindowsVersion(major, minor))
{
wcout << _T("Major:") << major << _T("Minor:") << minor << endl;
}
return 0;
}
说了这么多,我已经编写了两个代码示例来获取 Windows 版本,而无需使用 GetVersionEx 或 GetVersion API。我已将它们发布在页面底部。问题是 GetVersionEx API 只需要大约 10 微秒来执行,而我的代码示例需要 10-50 毫秒来执行。
同意其他人的观点。如果您从头开始,在大多数情况下支持 TCHAR 的麻烦是不值得的。如果您正在构建一个全新的应用程序,您希望它至少可以使用 UTF16 字符串顺利运行(就像 .NET 和 java 一样)。实用点 1:您不会根据定义的编码预处理器构建应用程序的多个版本。支持 x64 与 X86 的构建分支真的很难。实用点 2:绝大多数 Windows API 实际上默认为 W 版本的 API。例如调用 SetWindowTextA 最终只会调用与 SetWindowTextW 相同的实现