Make Compatible
Make Compatible — программа, разработанная компанией Microsoft и включённая в состав операционных систем Windows 9x. Она изменяет системные параметры для отдельных приложений Windows, что позволяет программам, созданным специально для Windows 3.1, запускаться на более новых версиях системы. Имя исполняемого файла Make Compatible — mkcompat.exe, файл по умолчанию размещается в папке \Windows\System[1].[2]
Общие сведения
| Make Compatible | |
|---|---|
| Тип | Компьютерная программа |
| Разработчик | Microsoft |
| Операционная система | Windows 9x |
Возможности
При запуске Make Compatible позволяет выбрать имя файла исполняемой программы Windows 3.1 с помощью опции «Choose Program» в меню «File». После выбора файла в Make Compatible по умолчанию отображается список из пяти опций, которые можно изменить для управления поведением Windows при запуске указанной программы:[1]
- Не использовать спулинг в расширенные метафайлы
- Выделять приложению больше стека
- Сообщать приложению ложный размер структуры devmode принтера
- Сообщать приложению ложную версию Windows
- Использовать элементы управления в стиле Windows 3.1
С помощью меню «Advanced Options» («Расширенные настройки»), также доступного через меню «File», открывается дополнительный список настроек для более точного управления эмуляцией Windows 3.1 для конкретных приложений[1].
Совместимость (compatibility bits)
Каждая из установленных опций Make Compatible фиксируется в системной базе так называемых «битов совместимости». Это база однобитных флагов, по одному на каждую опцию, отображаемую утилитой[3].[4]
Такая база применялась и в более ранних версиях Windows. В Windows 3.1 она располагается в секции [Compatibility] файла win.ini, записи имеют вид:[3][4]
[Compatibility] ACAD=0x8000 AMIPRO=0x04000010
В каждой строке указывается имя программы и шестнадцатеричное число — код для ассоциации с этим приложением. В числе кодируются битовые флаги совместимости, применяемые Windows при запуске данной программы. Make Compatible просто предоставляет графический интерфейс для редактирования этих флагов, без необходимости вручную изменять win.ini в текстовом редакторе. С помощью Make Compatible можно установить или сбросить отдельные флаги, не зная их числовых значений[3].[4]
Битовые флаги совместимости, доступные в win.ini, не документированы ни в файле WININI.WRI, входящем в состав Windows 3.1, ни в Microsoft Windows 3.1 Resource Kit. Они приведены как набор определённых констант (имена начинаются с «GACF_», расшифровывается как «GetAppCompatFlags») без пояснений в заголовочном файле windows.h, входящем в комплект разработки драйверов для Windows 3.1. Для каждой задачи в ядре Windows информацию о действующих флагах совместимости можно получить с помощью недокументированной функции GetAppCompatFlags() из модуля KERNEL[5].
Расширенные флаги режима (Advanced mode flags)
Флаги расширенного режима, которые доступны из меню Advanced Options утилиты, документированы в статье Microsoft Knowledge Base №82860. Они соответствуют дополнительным «advanced mode» флагам:[5]
- 30 average width metrics
- Это 19-й бит слова битов совместимости, шестнадцатеричное значение
0x80000, символьное имяGACF_30AVGWIDTHв windows.h. Данный флаг заставляет Windows пересчитывать среднюю ширину символов для всех шрифтов с коэффициентом . Причиной была проблема совместимости с приложением TurboTax для Windows 3.0, жёстко фиксировавшим размеры и неправильно работавшим с новым методом расчёта в Windows 3.1, появившемся для поддержки TrueType. Из-за этого печать налоговых форм через TurboTax на PostScript-принтерах некорректно выполнялась[5]. - Always send NC_Paint
- 6-й бит,
0x40,GACF_ALWAYSSENDNCPAINT. Заставляет любую функциюSetWindowPos()всегда отправлять сообщениеWM_NCPAINTвсем дочерним окнам — поведение Windows 3.0. В Windows 3.1 такое сообщение отправляется только тем окнам, которым нужно перерисовать неклиентскую область. Некоторые приложения Windows 3.0 были рассчитаны на получение этого сообщения всегда, чтобы определить, требуется ли перерисовывать дочерние окна[5] - Don't enum device fonts
- 14-й бит,
0x2000,GACF_ENUMTTNOTDEVICE. Отключает установку флагаDEVICE_FONTTYPEдля некоторых типов принтеров (не матричные и не PostScript), если речь идёт о шрифтах TrueType. Некоторые программы (например, PageMaker и MGXDraw) неверно воспринимали этот флаг и считали такие шрифты установленными в принтере, из-за чего возникали ошибки при определении поддерживаемых размеров. Установка этого флага предотвращает такие ошибки.[5] - Don't send calcsize
WM_MOVE - 17-й бит,
0x20000,GACF_NCCALCSIZEONMOVE. Заставляет сообщениеWM_NCCALCSIZEотправляться окну не только при изменении размера, но и при простом перемещении (как в Windows 3.0). Некоторые старые приложения, например Lotus Notes, рассчитывали на такое поведение.[5] - Enum Helv and Times Roman fonts
- 12-й бит,
0x1000,GACF_ENUMHELVNTMSRMN. Устраняет проблему с приложениями, требовавшими наличия шрифтов с именами «Helv» и «Tms Rmn» (зарегистрированные торговые марки Linotype для Helvetica и Times Roman). Данный флаг заставляет Windows отображать «MS Sans Serif» и «MS Serif» как «Helv» и «Tms Rmn», чтобы поддерживать работоспособность таких приложений.[5] - Force extra windows words
- 8-й бит,
0x100,GACF_MOREEXTRAWNDWORDS. Решение проблемы с программами, предполагающими наличие дополнительных слов (данных) окна, даже если они явно не были запрошены. Windows 3.1, в отличие от 3.0, строго проверяла использование таких слов, из-за чего некорректно написанные приложения отказывались работать. При включении этого флага система сама добавляла 4 байта к запрашиваемому размеру.[5] - Force printer text to new band
- 1-й бит,
0x2,GACF_FORCETEXTBAND. Принуждает Windows 3.1 использовать две полосы при печати: для графики и для текста. Обычно Windows пыталась выводить всё в одной полосе; однако некоторые программы (например, WordPerfect) исходили из предположения, что всегда будет вторая полоса для текста, как в Windows 3.0.[5] - Force TT fonts to graphics band
- 15-й бит,
0x8000,GACF_FORCETTGRAPHICS. Решает проблемы с выводом TrueType-шрифтов как графики в Freelance Graphics.[5] - Global hooks only called for Win16 apps
- Ignore discardable segment attributes
- 0-й бит,
0x1,GACF_IGNORENODISCARD. Игнорирует флагGEM_NODISCARDдляGlobalAlloc(), чтобы исправить ошибку компилятора Microsoft C 6.0, где этот флаг по ошибке выставлялся в рантайм-библиотеке, приводя к проблемам для всех скомпилированных с ним приложений.[5] - Ignore raster fonts
- 9-й бит,
0x200,GACF_TTIGNORERASTERDUPE. Не отображает одинаковые размеры шрифтов и как растровые, и как TrueType, чтобы избежать сбоев в таких программах, как WordPerfect и Visual Basic.[5] - Ignore topmost windows
- 3-й бит,
0x8,GACF_IGNORETOPMOST. Исправляет ошибки работы, например, в cc:Mail, когда программа ожидает иное поведение функцииGetWindow(HWND, GW_HWND_FIRST)из-за «topmost»-окон, появившихся в 3.1.[5] - Module specific hack
- No HRGN 1
- 16-й бит,
0x10000,GACF_NOHRGN1. Восстанавливает ошибку из Windows 3.0, исправленную в 3.1, т. к. отдельные приложения (например, Microsoft Draw) реализовывали обход этого бага самостоятельно, что мешало их работе в исправленной системе.[5] - One graphic band and use print escapes
- 2-й бит,
0x4,GACF_ONELANDGRXBAND. Использует одну полосу для графики при печати в альбомном режиме, занимая всю необходимую память и отбрасывая лишнее.[5] - Subtract clip siblings
- 14-й бит,
0x4000,GACF_SUBTRACTCLIPSIBS. Управляет механизмом инвалидизации окон, особенно в диалоговых окнах и собственных комбинированных списках, реализованных, например, в Lotus Notes 2.1.[5] - Support multiple printing bands
- 5-й бит,
0x20,GACF_MULTIPLEBANDS. Принуждает Windows 3.1 всегда использовать множественные полосы при печати, чтобы решить проблему с Freelance Graphics, не пытавшимся выводить графику, если была только одна полоса.[5] - TT fonts are device fonts
- 4-й бит,
0x10,GACF_CALLTTDEVICE. Всегда устанавливает флагDEVICE_FONTTYPEдля TrueType-шрифтов, чтобы обеспечить совместимость с AmiPro и WordPerfect.[5] - Windows 3.1 palette behavior
Дополнительные флаги
В Windows 3.1 было определено 20 флагов совместимости для приложений.[5] В Windows 95 и 98 появилось ещё 11 флагов, не описанных в документации Microsoft Knowledge Base и не имеющих символьных имён в windows.h; их также можно установить через меню Advanced Options в Make Compatible:[6].
- Отключить кэш кистей 16 цветов и таймер 55 мс
- 29-й бит,
0x20000000. - Отключить EMF-спулинг
- 26-й бит,
0x4000000. - Отключить ассоциации шрифтов
- 24-й бит,
0x1000000. - Не подключать поток ввода при журналировании,
SetActiveWindowравенSetForeGroundWindow - 28-й бит,
0x10000000. - Не завершать работу/игнорировать некоторые ошибки/обрабатывать командную строку
- 25-й бит,
0x2000000. - Использовать элементы интерфейса 3.x
- 27-й бит,
0x8000000. - Принудительно использовать размер devmode принтера Win31
- 23-й бит,
0x800000. - Увеличить размер стека
- 22-й бит,
0x400000. - Сообщать ложные характеристики устройства/не выполнять проверку
SetDIBits - 20-й бит,
0x100000. - Сообщать ложную версию Windows
- 21-й бит,
0x200000. - Зеркалировать шрифты в win.ini
- 30-й бит,
0x40000000.
Примечания
- ↑ 1 2 3 Tim O'Reilly. Make Compatible // Windows 98 in a Nutshell : [англ.] / Tim O'Reilly, Troy Mott, Walter J. Glenn. — O'Reilly, 1999. — P. 227–228. — ISBN 978-1-56592-486-4.
- ↑ Charles J. Brooks. A+ Certification: (Exams 220-221, 220-222) : [англ.]. — 4. — Que, 2002. — P. 799. — ISBN 978-0-7897-2844-9.
- ↑ 1 2 3 Ron Petrusha. Where Am I Running? (англ.). windowsdevcenter.com. O'Reilly Media, Inc. (1 августа 1999). Архивировано 12 марта 2006 года.
- ↑ 1 2 3 Ed Bott and Woody Leonhard. Running Older Apps // 95 Only Undocumented Secrets : [англ.]. — Ziff-Davis Publishing Company.
- ↑ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Andrew Schulman. KERNEL: Windows system services // Undocumented Windows : [англ.] / Andrew Schulman, David Maxey, Matt Pietrek. — Addison-Wesley, 1992. — P. 244–250. — ISBN 0-201-60834-0.
- ↑ Rick Coogle. “Windows' 16-bit Program Compatibility Hacks” [англ.]. Архивировано из оригинала 2 сентября 2007. Дата обращения 10 февраля 2009. Используется устаревший параметр
|url-status=(справка)
Литература
- Microsoft Windows 95 Resource Kit : [англ.]. — Microsoft Press, 1995. — P. 718 и далее. — ISBN 978-1-55615-678-6.
- MKCOMPAT Makes Old Programs Behave (англ.), Smart Computing, Sandhills Publishing Company (июль 1997).
- “How to Use Mkcompat.exe for Windows 3.1-Based Programs”. Microsoft KnowledgeBase. 1.2 [англ.]. Microsoft. 20 января 2007. KBID 173086.
- “The WIN.INI [Compatibility] Section”. Microsoft KnowledgeBase. 1.0 [англ.]. Microsoft. 25 декабря 2000. KBID 82860.