Старые программы редко умирают сами по себе. Бухгалтерская утилита десятилетней давности, нужный по работе редактор, игра из юности - всё это нередко продолжает быть нужным спустя годы, а вот система под ними успевает смениться не раз. И тогда при запуске на свежей Windows старая программа либо вылетает с ошибкой, либо ведёт себя странно, либо вовсе отказывается стартовать. Причина не в том, что программа сломалась, а в том, что мир вокруг неё изменился. Режим совместимости - это способ заставить новую систему притвориться старой ровно настолько, чтобы древнее приложение почувствовало себя как дома.

Суть механизма проста. Режим совместимости позволяет программе работать так, будто она запущена в той версии Windows, для которой её создавали. Система подменяет для конкретного приложения часть своего поведения, выдавая себя за нужную версию, и старый код, рассчитанный на ту систему, перестаёт спотыкаться. Это не эмуляция и не виртуальная машина, а набор точечных подмен, которые включаются только для помеченной программы и не затрагивают остальную систему.

Почему старые программы перестают запускаться на новой системе

Главных причин несовместимости несколько, и большинство из них связаны с тем, как ужесточилась безопасность Windows со временем. Одна из самых частых - попытка старой программы запуститься с правами администратора, обратиться к системным папкам или защищённым областям реестра, что в современных системах при включённом контроле учётных записей недопустимо. Раньше, в системах до Vista, программы по умолчанию работали с полными правами, и разработчики свободно писали в любые папки. Теперь все приложения стартуют с правами обычного пользователя, и старый код, привыкший к вольнице, упирается в запрет.

Усугубляет дело то, что у древних программ часто нет в исполняемом файле специального раздела, объявляющего нужный уровень привилегий. Современная программа честно сообщает системе, что ей требуются права администратора, и система спрашивает разрешение у пользователя. Программа же, написанная до появления этого механизма, ничего не объявляет и просто пытается делать запретное, отчего и падает. Помощник по совместимости в таких случаях обнаруживает, что приложению не удалось записать свои файлы, и предлагает применить параметры совместимости.

Помимо прав есть и другие источники конфликтов. Старые программы могут рассчитывать на оформление интерфейса прежних систем, на определённое разрешение экрана, на цветовую палитру тех лет или на поведение системных функций, которое с тех пор изменилось. Режим совместимости как раз и набор подобных подмен: он умеет и выдать себя за старую версию системы, и отключить современные визуальные темы, и запустить программу с повышенными правами, и подстроить экранные параметры под ожидания древнего кода.

Помощник по совместимости как автоматический путь

Самый незаметный способ настройки часто срабатывает сам. Когда установка старой программы заканчивается сбоем или приложение явно ведёт себя как несовместимое, система сама замечает это и предлагает решение. Помощник по совместимости отслеживает запуск проблемных программ и по итогу первого запуска выдаёт рекомендацию запустить приложение с административными параметрами. Если пользователь соглашается нажатием соответствующей кнопки, помощник применяет режим запуска с правами администратора и перезапускает программу.

Особенно показателен случай со старыми апплетами панели управления, которые меняют системные настройки и потому нуждаются в административных правах. Те из них, что написаны до Vista, не имеют в исполняемом файле раздела с объявлением уровня привилегий, и при их запуске помощник обнаруживает проблему и в конце первого запуска предлагает запустить с повышенными правами. По сути система берёт на себя диагностику и сама подбирает простейшее лекарство, не требуя от пользователя технических знаний.

Этот автоматический путь хорош своей простотой, но имеет предел. Помощник реагирует на очевидные симптомы и применяет типовые решения, главным образом связанные с правами. Когда же проблема тоньше - программа требует выдать себя за конкретную старую версию системы или отключить определённую функцию оформления, - автоматики уже не хватает, и настройку приходится задавать вручную через свойства программы или прямой правкой реестра.

Ручная настройка через свойства исполняемого файла

Классический ручной способ живёт в свойствах исполняемого файла или его ярлыка, на вкладке совместимости. Там можно отметить флажок запуска в режиме совместимости и выбрать из списка версию Windows, под которую программа создавалась, а также отдельными галочками задать запуск с правами администратора, отключение визуальных тем и подстройку экранных параметров. Это наглядно и не требует ни командной строки, ни реестра, отчего подходит большинству пользователей.

Логика выбора версии простая: ставят ту систему, в которой программа заведомо работала. Если утилита родом из эпохи семёрки, выбирают совместимость с ней, если ещё древнее - спускаются к более старым вариантам вплоть до самых ранних систем. Иногда нужная версия угадывается не сразу, и тогда перебирают несколько, проверяя, при какой программа наконец запускается без сбоев. Подбор версии - это часто метод проб, а не точное знание.

Вкладка свойств удобна для разовой настройки одной программы на одной машине. Но у неё та же беда, что и у любой ручной графической операции: на десятке машин кликать по галочкам утомительно, а воспроизвести точь-в-точь те же настройки на новой машине трудно. Как только задача выходит за рамки одного компьютера, на первый план выходит настройка через реестр, которую легко описать в скрипте и растиражировать.

Управление режимом совместимости через реестр

Под капотом все настройки совместимости хранятся в реестре, и понимание этого даёт полный контроль. Параметры лежат в разделе слоёв совместимости, причём в двух местах: ветка текущего пользователя задаёт совместимость только для него, а ветка локальной машины - сразу для всех пользователей системы.

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Внутри нужного раздела создаётся строковый параметр, у которого имя - это полный путь к исполняемому файлу программы, а значение - набор флагов совместимости, разделённых пробелами. Флаг версии системы задаётся условным обозначением: для совместимости с семёркой используется одно ключевое слово, для совсем старых систем - другие, вплоть до обозначений девяностых годов. Чтобы вдобавок запускать программу с правами администратора, к флагу версии через пробел дописывают ключевое слово административного запуска.

"C:\Program\old_app.exe" = "WIN7RTM RUNASADMIN"

Здесь имя параметра - путь к программе, а значение предписывает запускать её в режиме совместимости с семёркой и с повышенными правами одновременно. Помимо версии и прав есть и другие флаги: например, отдельное ключевое слово отключает визуальные темы для программы, что лечит приложения, ломающиеся об современное оформление окон. Флаги свободно комбинируются в одной строке через пробел, складываясь в нужный набор подмен.

Реестровый способ ценен именно своей скриптуемостью. Одну и ту же запись легко добавить командой, а значит, и растиражировать на любое число машин. Пример ниже задаёт совместимость для всех пользователей через ветку локальной машины командой PowerShell.

$path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
New-ItemProperty -Path $path -Name "C:\Program\old_app.exe" `
    -Value "WIN7RTM RUNASADMIN" -PropertyType String -Force

Эта команда создаёт нужный строковый параметр в общесистемной ветке, и после неё указанная программа у всех пользователей будет запускаться в выбранном режиме. Завернув такие команды в скрипт, администратор разом настраивает совместимость нужных программ на всём парке машин, не притрагиваясь к свойствам каждого файла вручную.

Выбор между правами, версией системы и прочими флагами

Понимание, какой именно флаг применить, экономит время на переборе. Если программа падает при попытке записать свои файлы или изменить системные настройки, дело почти наверняка в правах, и лечит её флаг административного запуска. Если же приложение жалуется на версию системы, отказывается устанавливаться или ведёт себя так, будто не узнаёт окружение, нужен флаг совместимости с конкретной старой версией Windows.

Проблемы с внешним видом - мерцание, искажённые цвета, кривое отображение элементов - обычно снимаются флагом отключения визуальных тем, который заставляет программу рисоваться по упрощённой старой схеме. Сложные случаи нередко требуют сочетания флагов: и совместимость с версией, и административный запуск, и отключение тем разом. Поскольку флаги комбинируются, никто не мешает выставить сразу несколько и проверить, помогло ли.

Полезно держать в уме порядок проверки, чтобы не метаться вслепую:

  1. определить характер сбоя, отделив проблему прав от проблемы версии и от проблемы оформления;
  2. начать с самого вероятного флага под этот симптом, чаще всего с административного запуска или совместимости с версией;
  3. проверить запуск программы и, если не помогло, добавить или сменить флаг, а не отказываться сразу;
  4. при тонких симптомах оформления подключить отключение визуальных тем или подстройку экрана;
  5. найдя рабочую комбинацию вручную, перенести её в реестр и завернуть в скрипт для тиражирования;
  6. зафиксировать рабочие настройки где-то у себя, чтобы при переустановке системы не подбирать их заново.

Такой порядок превращает наугад тыканье в галочки в осмысленный поиск, который быстро сходится к рабочему решению.

Тонкая настройка через инструмент совместимости и базы исправлений

Флаги совместимости из свойств файла и реестра покрывают типовые случаи, но иногда их недостаточно. Бывают программы, которым нужна не просто подмена версии системы, а точечное исправление одного конкретного поведения - скажем, обход проверки версии при установке или подмена ответа единственной системной функции. Для таких тонких случаев существует профессиональный инструмент совместимости, входящий в набор средств развёртывания, который оперирует не общими режимами, а отдельными исправлениями.

Каждое такое исправление - это маленькая заплатка, перехватывающая конкретный вызов программы к системе и подменяющая его результат на тот, что ожидает старый код. Набор подобных заплаток складывается в базу совместимости, которая привязывается к конкретной программе и применяется к ней при запуске. В отличие от грубых флагов, перекраивающих поведение системы целиком, исправления хирургически точны: они трогают ровно то, что мешает данной программе, и не задевают ничего лишнего.

Создав базу с нужными исправлениями, её устанавливают в систему отдельной командой, и она начинает действовать для указанного приложения. Этот путь сложнее ручной правки реестра и требует понимания, какое именно исправление нужно, зато он решает случаи, перед которыми обычные флаги бессильны. На практике к нему прибегают, когда испробованы все типовые режимы, а программа всё равно капризничает: тогда точечная заплатка нередко оказывается единственным рабочим вариантом вернуть древнее приложение к жизни.

Что стоит за грамотным управлением совместимостью

Режим совместимости - это мост между эпохами программного обеспечения. Он позволяет ценным старым программам жить на современных системах, не вынуждая ни переписывать их, ни держать ради них отдельный древний компьютер. Понимание того, как этот мост устроен изнутри, отличает уверенного администратора от пользователя, который наугад перебирает галочки в надежде, что хоть одна сработает.

Зрелый подход начинается с диагноза, а не с лечения. Прежде чем включать совместимость, стоит понять, почему именно программа не работает: упирается ли она в права, в версию системы или в оформление. Точный диагноз ведёт к точному флагу, а точный флаг - к работающей программе с первой или второй попытки, а не после долгого перебора. А перенос найденной настройки в реестр и скрипт превращает разовое решение в воспроизводимое, которое переживёт и переустановку системы, и развёртывание на новых машинах.

В конечном счёте управление совместимостью - это уважение к работающему инструменту независимо от его возраста. Программа, исправно делавшая своё дело десять лет назад, способна делать его и сегодня, если дать ей привычное окружение. Несколько верно подобранных флагов, заданных однажды с пониманием, дарят старому коду вторую жизнь и избавляют от соблазна выбросить рабочий инструмент только потому, что система под ним повзрослела.