Make Compatible - это программа, разработанная Microsoft, которая входит в состав операционных систем Windows 9x. Он изменяет системные настройки каждой программы в Windows, чтобы программы Windows 3.1, специально адаптированные для этой платформы, могли выполняться в более новых версиях. Имя файла образа программы для Make Compatible - mkcompat.exe, и он хранится в каталоге \ Windows \ System.
Когда он вызывается, можно выбрать имя файла образа приложения Windows 3.1, используя опцию «Выбрать программу» в меню «Файл». После выбора файла образа программы в разделе «Сделать совместимым» по умолчанию отображается список из пяти параметров, которые можно настроить для изменения поведения Windows для этой программы при ее запуске:
Режим расширенных параметров, выбираемый с помощью пункта «Дополнительные параметры» в меню «Файл», представляет собой более длинный список параметров, позволяющий более точно управлять эмуляцией Windows 3.1, если этого требует конкретное приложение.
Каждый из вариантов записывается в системную базу данных так называемых «битов совместимости». Это база данных 1-битных флагов, по одному для каждой из опций, отображаемых функцией Make Compatible.
Эта база данных уже существовала в более ранних версиях Windows. В Windows 3.1, база данных хранится в [Совместимость] раздел win.ini, с элементами, такими как:
[Compatibility] ACAD=0x8000 AMIPRO=0x04000010
Каждая строка называет прикладную программу и дает шестнадцатеричную числовую константу для связи с этой программой. Шестнадцатеричная числовая константа кодирует битовые флаги совместимости для этого конкретного приложения, которые Windows применяет при выполнении приложения. Make Compatible просто предоставляет графический пользовательский интерфейс для удобного редактирования этих флагов, вместо того, чтобы редактировать win.ini вручную с помощью текстового редактора. Это позволяет устанавливать и снимать отдельные флаги, не зная их числовых значений.
Битовые флаги совместимости, устанавливаемые в win.ini, не задокументированы в файле WININI.WRI, который поставляется с Windows 3.1, или в Microsoft Windows 3.1 Resource Kit, опубликованном Microsoft. Они перечислены как простой набор определенных констант (с именами, начинающимися с «GACF_» для «GetAppCompatFlags») без объяснения причин в заголовочном файле windows.h, который входит в комплект разработчика драйверов устройств Microsoft Windows 3.1. В Windows 3.1 флаги совместимости, действующие для любой данной задачи в базе данных задач ядра, доступны для чтения с помощью недокументированной функции, которая экспортируется из модуля KERNEL. GetAppCompatFlags()
Флаги описаны в статье базы знаний Майкрософт № 82860. Они соответствуют флагам «расширенного режима», которые устанавливаются в меню «Дополнительные параметры» Make Compatible:
0x80000
, известным под символическим именем GACF_30AVGWIDTH
в windows.h. Этот флаг заставляет Windows повторно масштабировать все шрифты с коэффициентом при вычислении их средней ширины символов. Причина этого в том, что одно конкретное приложение Windows 3.0, TurboTax, жестко закодировало значения, которые оно использовало для таких вычислений размера, что не могло корректно работать с новым методом расчета средней ширины шрифта, совместимым с TrueType, используемым в Windows 3.1. Это помешало людям использовать TurboTax для печати форм декларации о доходах на принтерах PostScript. 0x40
, известным под символическим именем GACF_ALWAYSSENDNCPAINT
в windows.h. Этот флаг заставляет любой вызов SetWindowPos()
вызывать отправку WM_NCPAINT
сообщения всем дочерним окнам. Это поведение Windows 3.0. В Windows 3.1 поведение было изменено таким образом, что сообщение об окне отправляется только тем окнам, которым необходимо перекрашивать неклиентские области. Однако некоторые приложения Windows 3.0 полагались на постоянное получение этого сообщения, чтобы определить, нужно ли переставлять дочерние окна.0x2000
, известным под символическим именем GACF_ENUMTTNOTDEVICE
в windows.h. Этот флаг заставляет Windows 3.1 DEVICE_FONTTYPE
отключать флаг в определенных обстоятельствах, когда приложение, которое хочет распечатать, перечисляет шрифты. Особые обстоятельства заключаются в том, что целевой принтер не является точечно-матричным принтером или принтером PostScript, а шрифты являются шрифтами TrueType, которые не являются резидентными в самом принтере. В таких обстоятельствах некоторые приложения (включая PageMaker и MGXDraw ) неверно интерпретируют флаг и считают шрифт резидентным на устройстве. (Шрифты TrueType могут быть загружены Windows на принтеры, и для их использования не обязательно быть резидентными на самом устройстве.) Затем они запрашивают принтер, чтобы узнать, какие размеры шрифта он поддерживает, и когда это не удается (поскольку принтер не работает) не знают о шрифте, пока он не загружен), они ошибочно предполагают, что размер шрифта изменить нельзя. Установка DEVICE_FONTTYPE
флага в значение false в таких ситуациях предотвращает неправильную работу приложений, и это то, что делает этот битовый флаг совместимости.WM_MOVE
0x20000
, известным под символическим именем GACF_NCCALCSIZEONMOVE
в windows.h. Этот флаг заставляет WM_NCCALCSIZE
отправить сообщение в окно, которое перемещается или изменяется. Это поведение Windows 3.0. В Windows 3.1 поведение было изменено, так что сообщение об окне отправляется только в те окна, размер которых был изменен. Он не отправлялся, если окно просто перемещалось. Однако некоторые приложения Windows 3.0, такие как Lotus Notes, например, полагались на постоянное получение этого сообщения.0x1000
, известным под символическим именем GACF_ENUMHELVNTMSRMN
в windows.h. Этот флаг устраняет проблему с приложениями, которые отказывались работать должным образом, если только шрифты с точными именами «Helv» и «Tms Rmn» не были указаны как присутствующие в системе API перечисления шрифтов Windows. Названия являются товарными знаками компании Linotype для определенных шрифтов, Helvetica и Times Roman, и, поскольку Microsoft не поставляла эти шрифты Linotype с Windows 3.1, она не могла перечислить их как присутствующие. Этот флаг заставляет Windows перечислять шрифты «MS Sans Serif» и «MS Serif» под именами «Helv» и «Tms Rmn» для совместимости с приложениями, которые не работают без использования этих точных имен.0x100
, известным под символическим именем GACF_MOREEXTRAWNDWORDS
в windows.h. Этот флаг работает для решения проблемы с приложениями, которые предполагали существование оконных слов (дополнительных элементов данных, связанных Windows с окнами графического интерфейса), когда они фактически не информировали Windows о необходимости дополнительных оконных слов. Windows 3.1, в отличие от Windows 3.0, ограничивает все случаи использования дополнительных оконных слов, и приложения, которые предполагали, что могут использовать больше места, чем они запрашивали, таким образом терпят неудачу. Для приложений, запускаемых с этим флагом, Windows 3.1 незаметно увеличила общее количество слов, запрашиваемых приложением, на дополнительные 4 байта.0x2
, известным под символическим именем GACF_FORCETEXTBAND
в windows.h. Этот флаг заставляет Windows 3.1 всегда использовать два канала при печати: первый для графики, а второй для текста. Обычно Windows 3.1 пытается распечатать и то, и другое в одной полосе. Но такие приложения, как WordPerfect, предполагали, что второй бэнд всегда будет существовать и всегда будет там, где находится текст, как это было в Windows 3.0. У Freelance Graphics была похожая проблема.0x8000
, известным под символическим именем GACF_FORCETTGRAPHICS
в windows.h. Этот флаг должен был обойти проблему с Freelance Graphics, когда она не могла печатать с использованием шрифтов TrueType, если они не были напечатаны как графика.0x1
, известным под символическим именем GACF_IGNORENODISCARD
в windows.h. Этот флаг заставляет игнорировать GEM_NODISCARD
флаг, переданный GlobalAlloc()
программой. Он работал с ошибкой в библиотеке времени выполнения, поставляемой с собственным компилятором C Microsoft, Microsoft C версии 6. Библиотека времени выполнения ошибочно устанавливала этот флаг при вызовах GlobalAlloc()
, и любое приложение, скомпилированное с помощью этого компилятора, таким образом демонстрировало поведение.0x200
, известным под символическим именем GACF_TTIGNORERASTERDUPE
в windows.h. Этот флаг предотвращает перечисление шрифтов одного размера как растровых, так и шрифтов TrueType. Это произошло из-за того, что несколько приложений, включая WordPerfect и Visual Basic, не смогли правильно обработать эту конкретную ситуацию.0x8
, известным под символическим именем GACF_IGNORETOPMOST
в windows.h. Этот флаг устраняет конкретную проблему cc: Mail, которая вызвала сбой в Windows 3.1. Предполагалось, что доступ к первому окну с помощью GetWindow(HWND,GW_HWND_FIRST)
вернет ему окно приложения, с которого оно только что запустилось WinExec()
. Но в Windows 3.1, в которой появилась идея «самых верхних» окон, это уже не так. Флаг заставлял Windows 3.1 пропускать самые верхние окна при выполнении этого конкретного запроса API.0x10000
, известным под символическим именем GACF_NOHRGN1
в windows.h. Этот флаг восстанавливает ошибку, существовавшую в Windows 3.0, которая была исправлена в Windows 3.1. Это произошло потому, что некоторые приложения, такие как Microsoft Draw, сами работали над ошибкой и перестали работать правильно, когда ошибка была устранена. Ошибка заключалась в ошибке в возвращаемом значении GetUpdateRect()
функции, в результате чего в определенных ситуациях (когда все окно было недопустимым) она возвращала координаты прямоугольника обновления в координатах окна, а не в логических координатах, как предполагалось. В Windows 3.1 он всегда возвращал прямоугольник обновления в логических координатах. Приложения, которые работали с ошибкой, сами выполняли преобразование координат, чтобы обойти ошибку, и в конечном итоге обновляли неправильные части своих окон в Windows 3.1.0x4
, известным под символическим именем GACF_ONELANDGRXBAND
в windows.h. Этот флаг заставляет Windows 3.1 использовать одну полосу графики при печати в ландшафтном режиме, потребляя столько памяти, сколько необходимо для этой полосы, и отбрасывая все содержимое, которое не помещается в полосу.0x4000
, известным под символическим именем GACF_SUBTRACTCLIPSIBS
в windows.h. Этот флаг заставляет Windows 3.1 обрабатывать аннулирование окон по-разному для окон верхнего уровня, для которых не установлен WS_CLIPSIBLINGS
стиль окна, и для их дочерних окон. (Другими словами: это влияет на диалоговые окна и элементы управления на них.) Если установлен флаг, Windows не будет аннулировать дочерние окна, расположенные ниже (в z-порядке ) других WS_CLIPSIBLINGS
дочерних окон. Основной причиной установки флага были такие приложения, как Lotus Notes 2.1, которые реализовали свои собственные поля со списком как дочерние окна, а не как окна верхнего уровня (реализация поля со списком по умолчанию в системе). Если этот флаг установлен, нечетные проблемы с отображением в таких окнах исчезнут.0x20
, известным под символическим именем GACF_MULTIPLEBANDS
в windows.h. Этот флаг заставляет Windows 3.1 всегда использовать несколько полос для печати, даже если одной полосы будет достаточно. Это должно было обойти проблему в Freelance Graphics, которая предполагала, что если бы существовала только одна полоса, и это была бы вся страница, это была бы текстовая полоса, и даже не пыталась бы печатать графику. В Windows 3.1 универсальный драйвер принтера иногда может обрабатывать как текст, так и графику с помощью одной полосы. Принудительное использование нескольких диапазонов позволило избежать проблем, которые это могло вызвать для Freelance Graphics.0x10
, известным под символическим именем GACF_CALLTTDEVICE
в windows.h. Этот флаг заставляет Windows 3.1 всегда устанавливать DEVICE_FONTTYPE
флаг для любых шрифтов TrueType, перечисленных с помощью Windows EnumFont()
API. Это должно было исправить проблему с приложениями, включая AmiPro и WordPerfect, оба из которых предполагали, что все шрифты TrueType, доступные на принтере, будут резидентными.Windows 3.1 определила 20 флагов совместимости приложений. Windows 95 и 98 определили еще 11 флагов, не задокументированных в статье базы знаний и им не присвоенных символьных имен констант в windows.h, которые представляют собой остальные параметры, доступные через меню «Дополнительные параметры» в разделе «Сделать совместимым»:
0x20000000
.0x4000000
.0x1000000
.SetActiveWindow
ведении журнала, == SetForeGroundWindow
0x10000000
.0x2000000
.0x8000000
.0x800000
.0x400000
.SetDIBits
проверки0x100000
.0x200000
.0x40000000
.кодgt; 0x20000000