Прекращение поддержки WinAPI после Windows 8.1


person ST3    schedule 22.10.2013    source источник
comment
Не удалось как? Устаревший не должен означать сломанный.   -  person Cory Nelson    schedule 22.10.2013
comment
Microsoft пишет: GetVersionEx может быть изменен или недоступен для выпусков после Windows 8.1. Вместо этого используйте API-интерфейсы Version Helper.. Я предлагаю вам взглянуть на них.   -  person Uwe Keim    schedule 22.10.2013
comment
@CoryNelson вернул неправильную версию.   -  person ST3    schedule 22.10.2013
comment
Это очень распространенный вопрос. Введите номер версии Windows 8.1 в поле поиска в правом верхнем углу этой страницы.   -  person Hans Passant    schedule 22.10.2013
comment
@ Ганс Я вижу это, но мой вопрос не об API версий, а об устаревании, я смотрю, не устарело ли что-то еще.   -  person ST3    schedule 22.10.2013
comment
Мой ответ был удален модератором, но полный список изменений совместимости, включая изменения в сервере Windows и API рабочего стола, находится здесь: Совместимость клиента и сервера Windows 8.1 и Windows Server 2012 R2   -  person Martin Liversage    schedule 22.10.2013
comment
Просто найдите в заголовках SDK _DEPRECATE.   -  person Hans Passant    schedule 22.10.2013


Ответы (3)


Корпорация Майкрософт описала изменения в разделе изменения версии операционной системы в Windows. 8.1 и Windows Server 2012 R2. В левой части статьи вы можете перейти к другим вопросам, связанным с Совместимость клиента и сервера Windows 8.1 и Windows Server 2012 R2.

Поведение, которое вы испытываете, следующее:

В Windows 8.1 API GetVersion(Ex) объявлены устаревшими. Это означает, что, хотя вы по-прежнему можете вызывать API, если ваше приложение не предназначено специально для Windows 8.1, вы получите версию Windows 8 (6.2.0.0).

person Martin Liversage    schedule 22.10.2013
comment
Итак, вы говорите, что Windows добавила некоторые новые вещи в Windows 8.1, и только GetVersion(Ex) устарела? - person ST3; 22.10.2013
comment
Я говорю, что обо всех изменениях с 8.0 на 8.1, связанных с совместимостью (включая изменение на GetVersionEx), вы можете прочитать, перейдя по предоставленной ссылке. - person Martin Liversage; 22.10.2013
comment
Я понимаю это, но ваш ответ не отвечает на мой вопрос, он просто добавляет некоторую информацию об GetVersion(Ex) API. - person ST3; 22.10.2013
comment
@ST3: связанная страница описывает все несовместимости в Windows 8.1 - если это единственный API, который он перечисляет, то, возможно, это единственный API, который устарел. - person Dan Puzey; 22.10.2013

Кто-то на другом форуме указал мне на этот подход.

Включите GUID ОС Windows 8.1 в файл манифеста приложения

ваш .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 в Windows 8.1 и более поздних версиях Windows.

Другая проблема с этим подходом заключается в том, что GetVersionEx по-прежнему устарел, поэтому вы не сможете ориентироваться на набор инструментов платформы 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)

вы также можете использовать API NetWkstaGetInfo для получения версии локальной машины.

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 без использования API GetVersionEx или GetVersion. Я разместил их внизу страницы. Проблема в том, что для выполнения GetVersionEx API требуется всего около 10 микросекунд, в то время как для выполнения моих образцов кода требуется более 10-50 миллисекунд.

Получение версии Windows VerifyVersionInfo API

person Ehsan Samani    schedule 07.11.2013
comment
Как бы вы использовали это из С# без манифеста? Он понятия не имеет, что такое DWORD, _TCHAR, LPBYTE, NERR_Success, WKSTA_INFO_100, а также <<, -> и ::. - person vapcguy; 18.10.2017

Согласитесь с другими в этом. если вы начинаете с нуля, в большинстве случаев не стоит поддерживать TCHAR. Если вы создаете совершенно новое приложение, вы хотите, чтобы оно работало гладко, по крайней мере, со строками UTF16 (например, .NET и java). Пункт практичности 1: вы не собираетесь создавать несколько версий своего приложения на основе того, какой препроцессор кодирования определен. было действительно достаточно сложно поддерживать вилку x64 против X86. Пункт практичности 2: Подавляющее большинство API Windows фактически по умолчанию используют версию W API. например, вызов SetWindowTextA просто вызовет ту же реализацию, что и SetWindowTextW.

person Ehsan Samani    schedule 06.07.2020