2013-08-15 4 views
4

У меня есть код для обнаружения Windows XP, который, как я думаю, должен работать, но что я должен заменить '??', чтобы определить, запущен ли я в 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; 
} 
+7

Посмотрите на [примечания] (http://msdn.microsoft.com/en-us/library/ms724833 (v = vs.85) .aspx). – chris

+1

Главный вопрос: почему вы хотите это знать? Обычно вы должны проверить наличие необходимой функции. – MSalters

+0

Спасибо Крису. Позаботьтесь об этом, чтобы я мог принять это? –

ответ

5

На странице документации для OSVERSIONINFOEX структуры, две соответствующие поля сказать:

Для получения дополнительной информации см Примечания.

вниз в раздел примечаний удобная таблица:

 
Operating system Version number dwMajorVersion dwMinorVersion Other 
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  Not applicable 
Windows 2000    5    5    0  Not applicable 

Как видно из таблицы, XP является 5,1. не

1

Нет необходимости дополнительной библиотеки, заголовок, работает и на VC++ Экспресс

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 }

0

В SDK есть <VersionHelpers.h>, который предоставляет встроенные функции для проверки версий Windows. Исторически многие разработчики ошиблись в этих проверках, поэтому функции тезисов были добавлены, чтобы сделать проверки более надежными.

В частности, IsWindowsXPOrGreater() && !IsWindowsVistaOrGreater(), по-видимому, соответствует вашим потребностям.

Обратите внимание, что с помощью Windows 10 SDK с использованием GetVersionEx генерирует предупреждения об устаревании во время компиляции.

Смежные вопросы