5

我一直在使用GetVersionEx,但它在运行 Windows 8.1 的机器上失败了。在查看了一些信息后发现GetVersionEx自 8.1 版本以来已弃用。

我想问在哪里可以找到已弃用 API 的完整列表,因为我不想再使用它了。

编辑:我不是要使用什么来代替GetVersionEx,我要的是已弃用 API 的完整列表。

4

3 回答 3

7

微软已经描述了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)。

于 2013-10-22T13:12:40.717 回答
4

另一个论坛上的某个人向我指出了这种方法。

在应用程序清单文件中包含您的 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 毫秒来执行。

获取 Windows 版本 VerifyVersionInfo API

于 2013-11-07T01:44:06.453 回答
0

同意其他人的观点。如果您从头开始,在大多数情况下支持 TCHAR 的麻烦是不值得的。如果您正在构建一个全新的应用程序,您希望它至少可以使用 UTF16 字符串顺利运行(就像 .NET 和 java 一样)。实用点 1:您不会根据定义的编码预处理器构建应用程序的多个版本。支持 x64 与 X86 的构建分支真的很难。实用点 2:绝大多数 Windows API 实际上默认为 W 版本的 API。例如调用 SetWindowTextA 最终只会调用与 SetWindowTextW 相同的实现

于 2020-07-06T22:56:15.403 回答