Функция GetVersionEx для Windows 8.1 и выше (fasm)

Пишу приложение в fasm и у меня проблема с определением Windows версии 8.1 и выше. Функции GetVersionEx и Version Helper дают мне Windows 8. Как говорит MSDN, я должен настроить свое приложение, изменив файл манифеста в Visual Studio, но я не использую VS, так что мне делать?


person Binary Mind    schedule 21.12.2015    source источник
comment
См. Основные сведения о создании манифеста для программ C/C++, чтобы начать работу. Используйте переключатель компоновщика /MANIFESTINPUT (Specify Manifest Input), чтобы внедрить манифест. В случае, если вы используете FASM для связывания объектного кода, вам нужно указать ему встроить ресурс, используя ссылку resdata manifest инструкция макроса.   -  person IInspectable    schedule 21.12.2015
comment
MSDN не говорит, что вы должны делать это в VS.   -  person David Heffernan    schedule 21.12.2015
comment
Windows 8.1 — это версия, в которой поведение GetVersionEx() изменилось. Вы должны манифестировать свой исполняемый файл и указать совместимость с конкретными версиями ОС в этом манифесте, чтобы GetVersionEx() правильно сообщал эти номера версий. Это изменение в поведении хорошо задокументировано в MSDN.   -  person Remy Lebeau    schedule 22.12.2015


Ответы (2)


Любая среда программирования, которая позволяет вам связывать ресурсы с скомпилированным исполняемым файлом, может использоваться для создания ресурса манифеста. Все, что вам нужно сделать, это написать подходящий файл .manifest для вашего приложения, который содержит нужные значения XML, а затем связать содержимое этого файла непосредственно с ресурсами вашего приложения, убедившись, что тип ресурса равен 24, а идентификатор ресурса равен 1, 2 или 3 (см. эту страницу для получения подробной информации о том, когда какой идентификатор использовать). Для этого не обязательно использовать VisualStudio.

Если по какой-то причине вы не можете напрямую связать манифест с ресурсами вашего приложения, вы можете в качестве альтернативы сохранить XML в файл с именем <myappname>.exe.manifest (где <myappname> — фактическое имя вашего EXE-файла) и поместить его в ту же папку, что и ваше приложение. . Это не предпочтительный подход к проявлению, но он работает.

При этом существуют альтернативные API, которые вы можете использовать вместо помощников на основе GetVersion/Ex() или VerifyVersionInfo(), чтобы получить правильную версию ОС, вообще не занимаясь манифестацией. А именно, RtlGetVersion(), NetServerGetInfo() и NetWkstaGetInfo() (и все они были проверены на работоспособность в Windows 8.1 и 10).

person Remy Lebeau    schedule 21.12.2015

Файл манифеста представляет собой XML-файл, внедренный как ресурс Win32. Это также может быть внешний файл с именем your.exe.manifest. Поищите примеры в Интернете для образцов содержания.

person i486    schedule 21.12.2015