Сделать совместимым - Make Compatible

Сделать совместимым это программа, разработанная Microsoft что входит в Windows 9x операционные системы. Он изменяет системные настройки каждой программы в Windows, чтобы разрешить Windows 3.1 программы, специально предназначенные для этой платформы, для выполнения в новых версиях. Имя файла образа программы для Make Compatible: mkcompat.exe, и он хранится в Windows Система каталог.[1][2]

Опции

Когда он вызывается, можно выбрать имя файла образа прикладной программы Windows 3.1 с помощью параметра «Выбрать программу» в меню «Файл». После выбора файла образа программы в разделе «Сделать совместимым» по умолчанию отображается список из пяти параметров, которые можно настроить для изменения поведения Windows для этой программы при ее запуске:[1]

  • Не наматывать на усиленный мета-файлы[1]
  • Дайте приложению больше места в стеке[1]
  • Врать о размере режима принтера[1]
  • Врать о номере версии Windows[1]
  • Элементы управления в стиле Windows 3.1[1]

Режим расширенных параметров, который можно выбрать с помощью пункта «Дополнительные параметры» в меню «Файл», представляет собой более длинный список параметров, позволяющий более точно контролировать эмуляцию Windows 3.1, если этого требует конкретное приложение.[1]

Биты совместимости

Каждая из опций записывается в системную базу данных так называемых «битов совместимости». Это база данных 1-битных флагов, по одному для каждой из опций, отображаемых функцией Make Compatible.[3][4]

Эта база данных уже существовала в более ранних версиях Windows. В Windows 3.1 база данных хранится в [Совместимость] раздел win.ini, с такими записями, как:[3][4]

[Совместимость]ACAD=0x8000AMIPRO=0x04000010

Каждая строка называет прикладную программу и дает шестнадцатеричную числовую константу для связи с этой программой. Шестнадцатеричная числовая константа кодирует битовые флаги совместимости для этого конкретного приложения, которые Windows применяет при выполнении приложения. Сделать совместимым просто предоставляет графический интерфейс пользователя для удобного редактирования этих флагов, а не для редактирования win.ini вручную, с помощью текстового редактора. Это позволяет устанавливать и снимать отдельные флаги без необходимости знать их числовые значения.[3][4]

Битовые флаги совместимости, устанавливаемые в win.ini не задокументированы в WININI.WRI файл, который поставляется с Windows 3.1, или в Пакет ресурсов Microsoft Windows 3.1 опубликовано Microsoft. Они перечислены как простой набор определенных констант (с именами, начинающимися с «GACF_» вместо «GetAppCompatFlags») без объяснения причин в windows.h заголовочный файл который поставляется с комплектом разработки драйверов устройств Microsoft Windows 3.1. В Windows 3.1 флаги совместимости, действующие для любой данной задачи в базе данных задач ядра, доступны для чтения через недокументированный GetAppCompatFlags () функция, которая экспортируется из ЯДРО модуль.[5]

Флаги расширенного режима

Дополнительные параметры MkCompat (сделать совместимыми)

Флаги описаны в статье базы знаний Microsoft № 82860. Они соответствуют флагам «расширенного режима», которые устанавливаются в меню «Дополнительные параметры» Make Compatible:[5]

30 показателей средней ширины
Это 19-й бит слова битов совместимости с шестнадцатеричным значением. 0x80000, известный под символическим названием GACF_30AVGWIDTH в windows.h. Этот флаг заставляет Windows повторно масштабировать все шрифты с коэффициентом при вычислении их средней ширины символа. Причина в том, что одно конкретное приложение Windows 3.0, TurboTax, жестко запрограммировал значения, которые он использовал для таких вычислений размера, что не могло корректно работать с новым TrueType -совместимый метод расчета средней ширины шрифта, используемый в Windows 3.1. Это мешало людям использовать TurboTax для печати своих подоходный налог формы возврата на PostScript принтеры.[5]
Всегда отправлять NC_Paint
Это шестой бит слова битов совместимости с шестнадцатеричным значением. 0x40, известный под символическим названием GACF_ALWAYSSENDNCPAINT в windows.h. Этот флаг заставляет любой вызов SetWindowPos () вызвать отправку WM_NCPAINT сообщение всем дочерним окнам. Это поведение Windows 3.0. В Windows 3.1 поведение было изменено, так что сообщение об окне отправляется только тем окнам, которым требуется перекрашивать неклиентские области. Некоторые приложения Windows 3.0, однако, полагались на постоянное получение этого сообщения, чтобы определить, нужно ли переставлять дочерние окна.[5]
Не перечислять шрифты устройства
Это бит # 14 слова битов совместимости с шестнадцатеричным значением. 0x2000, известный под символическим названием GACF_ENUMTTNOTDEVICE в windows.h. Этот флаг заставляет Windows 3.1 включать DEVICE_FONTTYPE снимать флажок в определенных обстоятельствах, когда приложение, которое хочет распечатать, перечисляет шрифты. Особые обстоятельства заключаются в том, что целевой принтер не является матричный принтер или принтер PostScript, а шрифты являются шрифтами TrueType, которые не находятся в самом принтере. В таких условиях некоторые приложения (в том числе PageMaker и MGXDraw ) неправильно интерпретируют флаг и полагают, что шрифт резидентный на устройстве. (Шрифты TrueType могут быть загружены Windows на принтеры, и для их использования не обязательно быть резидентными на самом устройстве.) Затем они запрашивают принтер, чтобы узнать, какие размеры шрифта он поддерживает, и когда это не удается (потому что принтер не работает) не знают о шрифте, пока он не будет загружен), они ошибочно предполагают, что размер шрифта изменить нельзя. Установка DEVICE_FONTTYPE flag в false в таких ситуациях предотвращает неправильную работу приложений, и это то, что делает этот битовый флаг совместимости.[5]
Не отправляйте расчет WM_MOVE
Это 17-й бит слова битов совместимости с шестнадцатеричным значением. 0x20000, известный под символическим названием GACF_NCCALCSIZEONMOVE в windows.h. Этот флаг заставляет WM_NCCALCSIZE сообщение, которое будет отправлено в окно, которое перемещается или изменяется. Это поведение Windows 3.0. В Windows 3.1 поведение было изменено, так что сообщение об окне отправляется только тем окнам, размер которых был изменен. Он не отправлялся, если окно просто перемещалось. Однако некоторые приложения Windows 3.0, такие как Lotus Notes например, полагался на постоянное получение этого сообщения.[5]
Шрифты Enum Helv и Times Roman
Это 12-й бит слова битов совместимости с шестнадцатеричным значением. 0x1000, известный под символическим названием GACF_ENUMHELVNTMSRMN в windows.h. Этот флаг работает для решения проблемы с приложениями, которые отказывались работать должным образом, если только шрифты с точными именами «Helv» и «Tms Rmn» не были указаны как присутствующие в системе API перечисления шрифтов Windows. Имена являются товарными знаками Компания Линотип для определенных шрифтов, Helvetica и Times Roman, а поскольку Microsoft не поставляла эти шрифты Linotype с Windows 3.1, она не могла перечислить их как присутствующие. Этот флаг заставляет Windows перечислять шрифты «MS Sans Serif» и «MS Serif» под именами «Helv» и «Tms Rmn» для совместимости с приложениями, которые не работают без использования этих точных имен.[5]
Форсировать дополнительные слова окна
Это 8-й бит слова битов совместимости с шестнадцатеричным значением. 0x100, известный под символическим названием GACF_MOREEXTRAWNDWORDS в windows.h. Этот флаг работает для решения проблемы с приложениями, которые предполагали наличие оконных слов (дополнительных элементов данных, связанных Windows с окнами графического интерфейса), когда они фактически не информировали Windows о необходимости дополнительных оконных слов. Windows 3.1, в отличие от Windows 3.0, проверки границ любое использование дополнительных оконных слов и приложений, которые предполагали, что они могут использовать больше места, чем они запрашивали, таким образом терпят неудачу. Для приложений, работающих с этим флагом, Windows 3.1 незаметно увеличила общее количество слов, запрашиваемых приложением, на дополнительные 4 байта.[5]
Принудительно перенести текст на новый диапазон
Это бит №1 слова битов совместимости с шестнадцатеричным значением. 0x2, известный под символическим названием GACF_FORCETEXTBAND в windows.h. Этот флаг заставляет Windows 3.1 всегда использовать два канала при печати: первый для графики, а второй для текста. Обычно Windows 3.1 пытается распечатать оба в одном диапазоне. Но такие приложения, как WordPerfect, предполагали, что второй бэнд всегда будет существовать и всегда будет там, где находится текст, как это было в Windows 3.0. У Freelance Graphics была похожая проблема.[5]
Принудительно использовать шрифты TT в графическую полосу
Это 15-й бит слова битов совместимости с шестнадцатеричным значением. 0x8000, известный под символическим названием GACF_FORCETTGRAPHICS в windows.h. Этот флаг должен был обойти проблему с Графика для фрилансеров, где он не будет печататься с использованием шрифтов TrueType, если они не были напечатаны как графика.[5]
Глобальные хуки вызываются только для приложений Win16
Игнорировать атрибуты отбрасываемых сегментов
Это бит # 0 слова битов совместимости с шестнадцатеричным значением. 0x1, известный под символическим названием GACF_IGNORENODISCARD в windows.h. Этот флаг заставляет GEM_NODISCARD флаг передан GlobalAlloc () программой, которую следует игнорировать. Он работал с ошибкой в ​​библиотеке времени выполнения, поставляемой с собственными Microsoft. C компилятор Microsoft C версия 6. Библиотека времени выполнения ошибочно устанавливает этот флаг при вызовах GlobalAlloc (), и любое приложение, скомпилированное с помощью этого компилятора, таким образом будет демонстрировать такое поведение.[5]
Игнорировать растровые шрифты
Это бит # 9 слова битов совместимости с шестнадцатеричным значением. 0x200, известный под символическим названием GACF_TTIGNORERASTERDUPE в windows.h. Этот флаг предотвращает перечисление шрифтов одного размера как растровых, так и шрифтов TrueType. Это произошло потому, что несколько приложений, в том числе WordPerfect и Visual Basic, не смогли правильно справиться с этой конкретной ситуацией.[5]
Игнорировать самые верхние окна
Это бит №3 слова битов совместимости с шестнадцатеричным значением. 0x8, известный под символическим названием GACF_IGNORETOPMOST в windows.h. Этот флаг устраняет конкретную проблему с cc: Mail это привело к сбою в Windows 3.1. Предполагалось, что доступ к первому окну с GetWindow (HWND, GW_HWND_FIRST) вернет ему окно приложения, с которого оно только что запустилось WinExec (). Но в Windows 3.1, в которой появилась идея «самых верхних» окон, это уже не так. Флаг заставлял Windows 3.1 пропускать самые верхние окна при выполнении этого конкретного запроса API.[5]
Взлом для конкретного модуля
Нет HRGN 1
Это 16-й бит слова битов совместимости с шестнадцатеричным значением. 0x10000, известный под символическим названием GACF_NOHRGN1 в windows.h. Этот флаг восстанавливает ошибку, существовавшую в Windows 3.0, которая была исправлена ​​в Windows 3.1. Это произошло потому, что несколько приложений, например Microsoft Draw, сами работали над ошибкой и не работали корректно, когда ошибка была устранена. Ошибка заключалась в ошибке в возвращаемом значении GetUpdateRect () функция, посредством которой в определенных ситуациях (когда все окно было недействительным) она возвращала бы координаты прямоугольника обновления в координатах окна, а не в логических координатах, как предполагалось. В Windows 3.1 он всегда возвращал прямоугольник обновления в логических координатах. Приложения, которые работали с ошибкой, сами выполняли согласованное преобразование, чтобы обойти ошибку, и в конечном итоге обновляли неправильные части своих окон в Windows 3.1.[5]
Одна графическая полоса и побеги для печати
Это бит # 2 слова битов совместимости с шестнадцатеричным значением. 0x4, известный под символическим названием GACF_ONELANDGRXBAND в windows.h. Этот флаг заставляет Windows 3.1 использовать одну графическую полосу при печати в Ландшафтный режим, потребляя столько памяти, сколько необходимо для этой полосы, и отбрасывая все содержимое, которое не помещалось в полосе.[5]
Вычесть братьев и сестер клипа
Это 14-й бит слова битов совместимости с шестнадцатеричным значением. 0x4000, известный под символическим названием GACF_SUBTRACTCLIPSIBS в windows.h. Этот флаг заставляет Windows 3.1 по-разному обрабатывать аннулирование окна для окон верхнего уровня, которые не имеют WS_CLIPSIBLINGS набор стилей окна и их дочерние окна. (Другими словами: это влияет на диалоговые окна и элементы управления на них.) Если установлен флаг, Windows не будет аннулировать дочерние окна, расположенные ниже (в z-порядок ) Другой WS_CLIPSIBLINGS дочерние окна. Основной причиной появления флага были такие приложения, как Lotus Notes 2.1, в которых реализованы собственные поля со списком как дочерние окна, а не как окна верхнего уровня (реализация поля со списком по умолчанию). Если этот флаг установлен, нечетные проблемы с отображением в таких окнах исчезнут.[5]
Поддержка нескольких полос печати
Это бит # 5 слова битов совместимости с шестнадцатеричным значением. 0x20, известный под символическим названием GACF_MULTIPLEBANDS в windows.h. Этот флаг заставляет Windows 3.1 всегда использовать несколько полос для печати, даже если одной полосы будет достаточно. Это должно было обойти проблему в Freelance Graphics, которая предполагала, что если бы существовала только одна полоса, и это была бы вся страница, это была бы текстовая полоса, и даже не пыталась бы печатать графику. В Windows 3.1 универсальный драйвер принтера иногда может обрабатывать как текст, так и графику с помощью одной полосы. Принудительное использование нескольких диапазонов позволило избежать проблем, которые это могло вызвать для Freelance Graphics.[5]
Шрифты TT - это шрифты устройства
Это бит # 4 слова битов совместимости с шестнадцатеричным значением. 0x10, известный под символическим названием GACF_CALLTTDEVICE в windows.h. Этот флаг заставляет Windows 3.1 всегда устанавливать DEVICE_FONTTYPE на любых шрифтах TrueType, перечисленных с помощью Windows EnumFont () API. Это было сделано для решения проблемы с приложениями, включая AmiPro и WordPerfect, оба из которых предполагали, что все шрифты TrueType, доступные на принтере, будут резидентными.[5]
Поведение палитры Windows 3.1

Дополнительные флаги

Windows 3.1 определила 20 флагов совместимости приложений.[5] Windows 95 и 98 определили еще 11 флагов, не описанных в статье базы знаний и им не присвоенных символьных имен констант в windows.h, которые представляют собой остальные параметры, доступные через меню «Дополнительные параметры» в разделе «Сделать совместимым»:[6]

Отключить кэш 16 цветных кистей и таймер 55 мс
Это бит # 29 слова битов совместимости с шестнадцатеричным значением. 0x20000000.
Отключить намотку EMF
Это 26-й бит слова битов совместимости с шестнадцатеричным значением. 0x4000000.
Отключить ассоциации шрифтов
Это 24-й бит слова битов совместимости с шестнадцатеричным значением. 0x1000000.
Не прикрепляйте входной поток при ведении журнала, SetActiveWindow == SetForeGroundWindow
Это 28-й бит слова битов совместимости с шестнадцатеричным значением. 0x10000000.
Не выключать / игнорировать определенные ошибки / отменять кавычки в командной строке
Это 25-й бит слова битов совместимости с шестнадцатеричным значением. 0x2000000.
Включить функции пользовательского интерфейса 3.x
Это 27-й бит слова битов совместимости с шестнадцатеричным значением. 0x8000000.
Принудительный размер режима разработчика принтера Win31
Это 23-й бит слова битов совместимости с шестнадцатеричным значением. 0x800000.
Увеличить размер стека
Это 22-й бит слова битов совместимости с шестнадцатеричным значением. 0x400000.
Ложь про колпачки устройств / нет SetDIBits Проверка
Это 20-й бит слова битов совместимости с шестнадцатеричным значением. 0x100000.
Ложь о версии для Windows
Это 21-й бит слова битов совместимости с шестнадцатеричным значением. 0x200000.
Зеркальное отражение шрифтов в win.ini
Это 30-й бит слова битов совместимости с шестнадцатеричным значением. 0x40000000.

Рекомендации

  1. ^ а б c d е ж грамм час Тим О'Рейли; Трой Мотт и Уолтер Дж. Гленн (1999). «Сделать совместимым». Windows 98 в двух словах. О'Рейли. стр.227–228. ISBN  978-1-56592-486-4.
  2. ^ Чарльз Дж. Брукс (2002). Сертификация A +: (экзамены 220-221, 220-222) (4-е изд.). Que. стр.799. ISBN  978-0-7897-2844-9.
  3. ^ а б c Рон Петруша (1 августа 1999 г.). "Куда я бегу?". windowsdevcenter.com. O'Reilly Media, Inc.
  4. ^ а б c Эд Ботт и Вуди Леонхард. «Запуск старых приложений». 95 Только недокументированные секреты. Издательская компания "Зифф-Дэвис".
  5. ^ а б c d е ж грамм час я j k л м п о п q р s Эндрю Шульман; Дэвид Макси и Мэтт Пьетрек (1992). «ЯДРО: системные службы Windows». Недокументированные окна. Эддисон-Уэсли. стр.244–250. ISBN  0-201-60834-0.
  6. ^ Рик Кугл. "Хаки для совместимости 16-битных программ Windows". Архивировано из оригинал 2 сентября 2007 г.. Получено 10 февраля 2009. Цитировать журнал требует | журнал = (помощь)

дальнейшее чтение

код> 0x20000000