Начиная с Windows Vista, Microsoft добавила класс совместимости, который позволит приложению, которое предполагает , имеет административный файл и реестр , чтобы продолжить функция.
Другими словами: приложение, которое не удалось на Windows XP , будет работать на Windows Vista .
Эти исправления ошибок, предоставляемые ОС, можно отключить, добавив раздел в манифест приложения , заявив, что приложение должно запускаться asInvoker
:
<!-- Disable Windows Vista standard user compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"/>
</requestedPrivileges>
</security>
</trustInfo>
В идеале разработчик должен протестировать свое приложение, чтобы убедиться, что оно (без необходимости) не требует административных привилегий. Для того, чтобы я мог проверить это, мне нужно было бы продемонстрировать это asInvoker .
Но когда дело доходит до этого, я не собираюсь выпускать приложение для клиента, проявленное asInvoker . Если я что-то пропустил , я не хочу, чтобы на пользователя оказывали влияние. Я хочу Операционная система Microsoft, чтобы исправить мои ошибки. Проблема с этим решением:
- я должен изменить manfiest перед выпуском
- Я никогда не узнаю о вещах, которые я пропустил, потому что они просто работают в Windows Vista.
Аналогичная головоломка возникает с Windows 7 поддерживаемых OS манифестов . Вы можете добавить в приложение манифест, указывающий, для какой версии Windows вы были разработаны и протестированы:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
В случае поддерживаемых элементов OS операционная система заранее знает, для какой ОС вы были разработаны. Это поместит ваше приложение в контекст Windows Vista, если вы не скажете, что поддерживаете Windows 7:
(источник: msdn.com )
Это действие похоже на запуск приложения в некоторых Режимах совместимости , например ::1010 *
- Windows Server 2008 (с пакетом обновления 1)
- Windows Vista (с пакетом обновления 2)
- Windows Vista (с пакетом обновления 1)
- Windows Vista
- Windows Server 2003 (пакет обновления 1)
- Windows XP (с пакетом обновления 2)
- Windows 2000
- Windows NT 4.0 (с пакетом обновления 5)
- Windows 98 / Windows Me
- Windows 95
, где вы получите таблицу приложений совместимости, и Windows будет эмулировать старое недокументированное поведение, чтобы предотвратить сбой вашего приложения, когда оно зависело от этого недокументированного поведения.
Пример совместимости показывает, что Windows 7 предоставит для приложения, работающего в контексте Windows Vista :
- RPC будет использовать старый пул частных потоков, а не пул потоков ОС
- Вы сможете заблокировать основной буфер отображения видео рабочего стола
- вы сможете Blit в основной видеобуфер рабочего стола без указания окна отсечения
- вы будете уязвимы для состояния гонки GetOverlappedResult (если вы зависели от него)
- вы будете продолжать получать смягчение программы Compatibilty Assistant (PCA)
И еще раз, чтобы правильно протестировать мое приложение под Windows 7 , я должен добавить запись манифеста supportOS . Но, опять же, я не собираюсь отправить приложение с этим флагом, потому что я не хочу потерять преимущество этих шайб (например, PCA). И, опять же, если в приложении есть проблемы, которые были исправлены из-за того, что оно работало в контексте Vista : я никогда не узнаю об этом от наших клиентов - потому что приложение просто работает.
Мысли? Руководство? Лучшие практики?