Сделать совместимым
![]() | Эта статья может быть слишком технической для понимания большинства читателей . ( февраль 2009 г. ) |
![]() | |
![]() Сделать совместимым, показывая расширенные флаги | |
Разработчик(и) | Майкрософт |
---|---|
Операционная система | Windows 9x |
Make Compatible — это программа, разработанная Microsoft и входящая в состав Windows 9x операционных систем . Он изменяет системные настройки для каждой программы в Windows, чтобы позволить программам Windows 3.1 , специально адаптированным для этой платформы, выполняться в более новых версиях. Имя файла образа программы для Make Compatible: mkcompat.exe и хранится в папке \Windows\Система . Каталог [1] [2]
Параметры
[ редактировать ]При его вызове можно выбрать имя файла образа прикладной программы Windows 3.1, используя опцию «Выбрать программу» в меню «Файл». После того, как файл образа программы выбран, Make Compatible по умолчанию отображает список из пяти параметров, которые можно настроить для изменения поведения 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]
[Compatibility] ACAD=0x8000 AMIPRO=0x04000010
В каждой строке указывается прикладная программа и указывается шестнадцатеричная числовая константа, которую можно связать с этой программой. Шестнадцатеричная числовая константа кодирует битовые флаги совместимости для этого конкретного приложения, которые Windows применяет при выполнении приложения. Make Compatible просто предоставляет графический интерфейс пользователя для простого редактирования этих флагов, а не редактирования. 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]
Флаги расширенного режима
[ редактировать ]Флаги описаны в статье базы знаний 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
- Это бит №6 слова битов совместимости с шестнадцатеричным значением.
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
значение false в таких ситуациях предотвращает сбои в работе приложений, и именно это и делает этот битовый флаг совместимости. [5] - Не отправлять Calcsize
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. Названия являются товарными знаками компании Linotype для определенных шрифтов Helvetica и Times Roman , и поскольку Microsoft не поставляла эти шрифты Linotype с Windows 3.1, она не могла перечислить их как присутствующие. Этот флаг заставляет Windows перечислять шрифты «MS Sans Serif» и «MS Serif» под именами «Helv» и «Tms Rmn» для совместимости с приложениями, которые не работают без использования этих точных имен. [5] - Принудительно использовать дополнительные слова Windows
- Это бит №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 . Этот флаг должен был обойти проблему с Freelance Graphics , из-за которой шрифты TrueType не печатались, если они не были напечатаны как графика. [5] - Глобальные перехваты вызываются только для приложений Win16.
- Игнорировать атрибуты отбрасываемого сегмента
- Это бит №0 слова битов совместимости с шестнадцатеричным значением.
0x1
, известный под символическим названиемGACF_IGNORENODISCARD
в windows.h . Этот флаг заставляетGEM_NODISCARD
флаг переданGlobalAlloc()
программой, которую следует игнорировать. Он работал над ошибкой в библиотеке времени выполнения, поставляемой с собственным компилятором C Microsoft , 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, которые перечисляются с помощью WindowsEnumFont()
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
.
Ссылки
[ редактировать ]- ^ Jump up to: а б с д и ж г час Тим О'Рейли; Трой Мотт и Уолтер Дж. Гленн (1999). «Сделать совместимым» . Коротко о Windows 98 . О'Рейли. стр. 227–228 . ISBN 978-1-56592-486-4 .
- ^ Чарльз Дж. Брукс (2002). Сертификация A +: (экзамены 220–221, 220–222) (4-е изд.). Que. стр. 799 . ISBN 978-0-7897-2844-9 .
- ^ Jump up to: а б с Рон Петруша (1 августа 1999 г.). "Куда я бегу?" . windowsdevcenter.com . О'Рейли Медиа, Инк.
- ^ Jump up to: а б с Эд Ботт и Вуди Леонхард. «Запуск старых приложений» . 95 Только недокументированные тайны . Издательская компания Зифф-Дэвис.
- ^ Jump up to: а б с д и ж г час я дж к л м н тот п д р с Эндрю Шульман; Дэвид Макси и Мэтт Питрек (1992). «ЯДРО: Системные службы Windows» . Недокументированная Windows . Аддисон-Уэсли. стр. 244–250 . ISBN 0-201-60834-0 .
- ^ Рик Кугл. «Советы по обеспечению совместимости 16-битных программ Windows» . Архивировано из оригинала 2 сентября 2007 года . Проверено 10 февраля 2009 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь )
Дальнейшее чтение
[ редактировать ]- Ресурсный комплект Microsoft Windows 95 . Майкрософт Пресс. 1995. стр. 718 и далее. ISBN 978-1-55615-678-6 .
- «MKCOMPAT заставляет старые программы вести себя хорошо» . Умные вычисления . Том. 8, нет. 7. Издательская компания «Сандхиллс». Июль 1997 года.
- «Как использовать Mkcompat.exe для программ под управлением Windows 3.1» . База знаний Майкрософт . 1.2. Майкрософт . 20 января 2007 г. KBID 173086.
- «Раздел WIN.INI [Совместимость]» . База знаний Майкрософт . 1.0. Майкрософт . 25 декабря 2000 г. KBID 82860.