5

我运行了一些代码来检测我认为应该可以工作的 Windows XP,但是我应该用什么替换 '??' 来检测我是否在 Windows XP 上运行?

bool IsWindowsXP()
{
    bool isWindowsXp = false;

    OSVERSIONINFOEX osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if( GetVersionEx((OSVERSIONINFO*)&osvi) )
    {
        const DWORD MinXpVersion = ??;
        const DWORD MaxXpVersion = ??;
        if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && 
            (vi.dwMajorVersion >= MinXpVersion) &&
            (vi.dwMajorVersion <= MinXpVersion))
        {
            isWindowsXp = false;
        }
    }

    return isWindowsXp;
}
4

3 回答 3

5

OSVERSIONINFOEX结构的文档页面上,两个相关字段是这样说的:

有关详细信息,请参阅备注。

在备注部分有一个方便的表格:

操作系统 版本号 dwMajorVersion dwMinorVersion 其他
Windows 8 6.2 6 2 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 6.2 6 2 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 2008 6 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista 6 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server 5.2 5 2 OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Prof x64 Ed 5.2 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
Windows XP 5.1 5 1 不适用
Windows 2000 5 5 0 不适用

如表中所示,XP 为 5.1。

于 2013-08-15T13:42:14.143 回答
2

不需要额外的库、头文件,也可以在VC++ Express 上工作:

BOOL chkxp(){
    DWORD version = GetVersion();
    DWORD major = (DWORD)(LOBYTE(LOWORD(version)));
    DWORD minor = (DWORD)(HIBYTE(LOWORD(version)));
    return ((major == 5) && (minor == 1)); // 5.1 is WIN Xp  5.2 is XP x64
}
于 2015-12-29T21:00:35.977 回答
0

SDK 有<VersionHelpers.h>,它提供了用于检查 Windows 版本的内联函数。从历史上看,许多开发人员都将这些检查弄错了,因此添加了这些功能以使检查更加万无一失。

特别是,IsWindowsXPOrGreater() && !IsWindowsVistaOrGreater()似乎解决了您的需求。

请注意,对于 Windows 10 SDK,使用 GetVersionEx 会在编译时生成弃用警告。

于 2015-12-29T21:55:10.077 回答